Почему двоичные файлы 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"