Похоже, что при добавлении каталога в $ PATH его подкаталоги не добавляются рекурсивно. Так я могу это сделать? Или есть причина, почему это не поддерживается?
Похоже, что при добавлении каталога в $ PATH его подкаталоги не добавляются рекурсивно. Так я могу это сделать? Или есть причина, почему это не поддерживается?
Ответы:
Добавьте их рекурсивно, используя find следующим образом:
PATH=$PATH$( find $HOME/scripts/ -type d -printf ":%p" )
ВНИМАНИЕ: Как уже упоминалось в комментариях к вопросу, это не поощряется, поскольку представляет угрозу безопасности, поскольку нет гарантии, что исполняемые файлы в добавленных каталогах не являются вредоносными.
Вероятно, это лучшее решение, чтобы следовать ответу Жиля и использовать укладку
$PATHэто опасно, но добавление подкаталогов не заметно хуже. Но обычно это бесполезно и, возможно, неэффективно (и иногда может даже привести к ограничению размера среды).
~/binИли ~/scripts), поэтому его безопасность остается неизменной.
~/scripts. Я не и никто другой не должен
Обычная структура каталогов unix имеет файлы приложений, отсортированные по каталогам по видам: binдля исполняемых файлов, libдля библиотек, docдля документации и так далее. Вот когда они установлены в отдельных каталогах; часто приложения сгруппированы в несколько каталогов (следовательно , многие системы имеют только три директории в $PATH: /usr/local/bin, /usr/binа /bin). Редко иметь в каталоге как исполняемые файлы, так и подкаталоги, поэтому нет необходимости включать в них подкаталоги каталога $PATH.
Иногда может быть полезно включить все binподкаталоги подкаталогов данного каталога в $PATH:
for d in /opt/*/bin; do PATH="$PATH:$d"; done
Однако это редко делается. Обычный метод, когда должны выполняться исполняемые файлы в нестандартных каталогах, $PATHсостоит в создании символических ссылок в каталоге по пути, например /usr/local/bin. stowПолезности (или xstow) могут быть полезными в этом отношении.
Одна из причин, по которой это не поддерживается, заключается в том, что каталоги bin / (и аналогичные) используют символические ссылки для указания на конкретные каталоги, в которые установлены реальные исполняемые файлы программ.
Таким образом, если вы $PATHвключаете /usr/local/bin(что, скорее всего, делает), эта папка полна символических ссылок (например ruby), которые указывают на конкретный каталог, где найден код для запуска ruby (например ../Cellar/ruby/2.1.3/bin/ruby).
Вот почему вам не нужно указывать папку каждого исполняемого файла в вашем $PATH; символические ссылки, обычно находящиеся в каталогах bin / type, обрабатывают это для вас.
В zsh $ PATH может быть добавлен в виде массива. Вы можете использовать оболочку для добавления нескольких подкаталогов в массив $ PATH.
Пример:
В .zshrc:
typeset -U PATH path
BINPATH="$HOME/bin"
path+=("$BINPATH" ${BINPATH}/*/)
export PATH
Это добавит все подкаталоги $ BINPATH в массив $ PATH.