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

270
VxJasonxV

Я установил несколько утилит 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, и конечно три идут утилиты я установленные там присутствуют. Спасло меня от долгих 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 
0
Предполагая, что это bash, вы можете показать вывод `type -a hey 'и даже` type -a which`? grawity 5 лет назад 0
Я действительно недостаточно использую `type`, я думаю, что могу посчитать количество раз с одной стороны. Я склонен делать прямые проверки с флагами `ls`, чтобы определить его атрибуты. Обязательно сохраню `type -a` для дальнейшего использования… VxJasonxV 5 лет назад 0
Атрибуты? Это ... не совсем то, для чего `type`. grawity 5 лет назад 0

1 ответ на вопрос

2
grawity

Насколько я понимаю, использование ~/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" 
Это невероятно. И правда, в прошлом я всегда использовал `$ HOME` в` $ PATH` и любые другие переменные окружения оболочки. Это, без сомнения, другой BSD coreutils (который поставляется с macOS) и несоответствие GNU coreutils. Мне нужно проверить это на машине Linux сейчас тоже. VxJasonxV 5 лет назад 0

Похожие вопросы