Я установил несколько утилит 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 ответ1

2

Насколько я понимаю, использование ~/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"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .