Как я могу установить все подкаталоги каталога в $ PATH?


38

Похоже, что при добавлении каталога в $ PATH его подкаталоги не добавляются рекурсивно. Так я могу это сделать? Или есть причина, почему это не поддерживается?


5
Зачем тебе это?
Алекс

10
@alex: Почему ты думаешь, что в этом нет необходимости?
Тим

4
@ Причина, по которой он не поддерживается, как правило, в том, что это угроза безопасности и, как правило, не требуется. Если вы рекурсивно добавляете каталоги к своему пути, кто знает, что может застрять там ... усложняет аудит.
ксенотеррацид

4
@Tim: это действительно удивительная и необычная вещь, которую хочется хотеть, вот почему.
Алекс

8
@alex как насчет подкаталогов в каталоге bin? Я хотел бы организовать сценарии в каталогах в папке bin.
Энди

Ответы:


19

Добавьте их рекурсивно, используя find следующим образом:

PATH=$PATH$( find $HOME/scripts/ -type d -printf ":%p" )

ВНИМАНИЕ: Как уже упоминалось в комментариях к вопросу, это не поощряется, поскольку представляет угрозу безопасности, поскольку нет гарантии, что исполняемые файлы в добавленных каталогах не являются вредоносными.

Вероятно, это лучшее решение, чтобы следовать ответу Жиля и использовать укладку


6
Предупреждение: этот ответ технически верен, но, как заметили Алекс и Ксенотеррацид, это крайне ненадежная вещь, и вам стоит подумать дважды, прежде чем использовать ее.
Калеб

2
Пожалуйста, добавьте предупреждение к своему ответу о том, почему это не очень хорошая, безопасная вещь на практике.
Калеб

3
Я не считаю это особенно опасным ; Добавление случайных каталогов в $PATHэто опасно, но добавление подкаталогов не заметно хуже. Но обычно это бесполезно и, возможно, неэффективно (и иногда может даже привести к ограничению размера среды).
Жиль "ТАК - перестань быть злым"

3
@Caleb: возможно, сумасшедший, но почему небезопасный? Если у кого-то есть доступ к добавлению вредоносных исполняемых файлов в подкаталоги, он также может добавить их в родительский каталог (т. Е. ~/binИли ~/scripts), поэтому его безопасность остается неизменной.
MestreLion

2
Угроза безопасности, если вы работаете в среде, где случайные люди могут добавлять вредоносные файлы в ваш ~/scripts. Я не и никто другой не должен
oseiskar

21

Обычная структура каталогов 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) могут быть полезными в этом отношении.


4

Одна из причин, по которой это не поддерживается, заключается в том, что каталоги bin / (и аналогичные) используют символические ссылки для указания на конкретные каталоги, в которые установлены реальные исполняемые файлы программ.

Таким образом, если вы $PATHвключаете /usr/local/bin(что, скорее всего, делает), эта папка полна символических ссылок (например ruby), которые указывают на конкретный каталог, где найден код для запуска ruby ​​(например ../Cellar/ruby/2.1.3/bin/ruby).

Вот почему вам не нужно указывать папку каждого исполняемого файла в вашем $PATH; символические ссылки, обычно находящиеся в каталогах bin / type, обрабатывают это для вас.


1

В zsh $ PATH может быть добавлен в виде массива. Вы можете использовать оболочку для добавления нескольких подкаталогов в массив $ PATH.

Пример:

В .zshrc:

typeset -U PATH path
BINPATH="$HOME/bin"
path+=("$BINPATH" ${BINPATH}/*/)
export PATH

Это добавит все подкаталоги $ BINPATH в массив $ PATH.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.