`which` не показывает путь к скрипту в ~ / bin - PullRequest
0 голосов
/ 28 сентября 2019

Из любопытства я позвонил which myscript.sh для сценария, который у меня есть под ~/bin/myscript.sh (в bash macOS).Я могу без проблем выполнить скрипт из любого каталога, не указав его полный путь.~/bin находится на моем PATH, и в сценарии установлены исполняемые флаги, ls -l выводит -rwxr-xr-x.

Я бы ожидал, что which покажет мне полный путь скрипта, но он ничего не выводил.

Это предполагаемое поведение или здесь происходит что-то странное?

1 Ответ

1 голос
/ 28 сентября 2019

Это происходит, когда вы добавляете буквальную тильду ~ к вашему PATH вместо фактического пути к вашему домашнему каталогу.Перезапись ~ в /home/youruser - это работа оболочки, а не инструмента или файловой системы.Например, если вы цитируете "~", это переписывание не происходит, и другие инструменты, такие как which, запутываются.

Вот информация по этому вопросу из shellcheck wiki :


Буквенная тильда в PATH плохо работает во всех программах.

Проблемный код:

PATH="$PATH:~/bin"

Правильный код:

PATH="$PATH:$HOME/bin"

Обоснование:

Наличие букв ~ в PATH - плохая идея.Bash это обрабатывает, но больше ничего не делает.

Это означает, что даже если вы всегда используете Bash, вам следует избегать этого, потому что любая вызываемая программа, использующая PATH, будет эффективно игнорировать эти записи.

Например, make может сказать foo: Command not found, хотя foo отлично работает из оболочки, и Make и Bash оба используют один и тот же PATH.Вы получите аналогичные сообщения от любых не вызванных bash-скриптов, и whereis будет пустым.

Используйте вместо $HOME или полный путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...