Похоже, что при добавлении каталога в $ 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.