Почему двоичные файлы Go (lang) не отображаются в `which`, `whereis` и подобных инструментах?

Я установил несколько утилит Go через go get -u github.com/[owner]/[repo] и я не понимаю, почему они не соблюдают стандартные правила оболочки. Устанавливаемая мною утилита не обнаружила никаких следов в каталоге, из которого была запущена команда, и никаких выходных данных, указывающих на что-либо, поэтому я искал ее довольно стандартным способом и не мог ее найти, хотя всегда мог ее запустить:

~ $ which hey
~ $ hey
Usage: hey [options...] <url>

Options:
  -n  Number of requests to run. Default is 200.
  -c  Number of requests to run concurrently. Total number of requests cannot be smaller than the concurrency level. Default is 50.
[…]

Я понял это только потому, что заметил, что $PATH включает в себя :~/go/binи, конечно же, три утилиты go, которые я установил, присутствуют там. Спас меня от долгой затяжки find поиск.

Как установленные двоичные файлы Go избегают стандартных средств поиска файлов, но остаются в состоянии работать?

Это происходит в стандартной оболочке bash, поставляемой с macOS High Sierra (10.13.6).

~ $ type -a hey
hey is /Users/jsalaz/go/bin/hey
~ $ type -a which
which is /usr/bin/which

1 ответ

Решение

Насколько я понимаю, используя ~/go/bin поскольку компонент $PATH опирается на нестандартное (возможно, GNU?) расширение.

  • Всякий раз, когда ваша оболочка (bash) ищет двоичные файлы, она расширяет ~/ префикс к пути вашего домашнего каталога. Ты это видишь type (которая встроена в оболочку) находит программу Go просто отлично.

  • Между тем, /usr/bin/which Команда (предоставляемая macOS и не являющаяся частью оболочки) не выполняет это расширение, поскольку в официальном описании The Open Group о том, как должен работать $PATH, ничего не было указано.

Другими словами, ~/ Префикс является частью языка оболочки, но не является частью общего синтаксиса пути для всей ОС. Во всех других местах, включая $PATH (который не ограничивается оболочками!), Это просто означает каталог с именем ~,

При установке $PATH, вы должны убедиться, что пути раскрываются во время присваивания:

PATH=$PATH:~/go/bin
PATH=$PATH:$HOME/go/bin
PATH="$PATH:$HOME/go/bin"

Этот не будет работать:

PATH="$PATH:~/go/bin"
Другие вопросы по тегам