Как я могу установить все подкаталоги каталога в $ PATH?
38
Похоже, что при добавлении каталога в $ PATH его подкаталоги не добавляются рекурсивно. Так я могу это сделать? Или есть причина, почему это не поддерживается?
@alex: Почему ты думаешь, что в этом нет необходимости?
Тим
4
@ Причина, по которой он не поддерживается, как правило, в том, что это угроза безопасности и, как правило, не требуется. Если вы рекурсивно добавляете каталоги к своему пути, кто знает, что может застрять там ... усложняет аудит.
ксенотеррацид
4
@Tim: это действительно удивительная и необычная вещь, которую хочется хотеть, вот почему.
Алекс
8
@alex как насчет подкаталогов в каталоге bin? Я хотел бы организовать сценарии в каталогах в папке bin.
Энди
Ответы:
19
Добавьте их рекурсивно, используя find следующим образом:
PATH=$PATH$( find $HOME/scripts/ -type d -printf ":%p" )
ВНИМАНИЕ: Как уже упоминалось в комментариях к вопросу, это не поощряется, поскольку представляет угрозу безопасности, поскольку нет гарантии, что исполняемые файлы в добавленных каталогах не являются вредоносными.
Вероятно, это лучшее решение, чтобы следовать ответу Жиля и использовать укладку
Предупреждение: этот ответ технически верен, но, как заметили Алекс и Ксенотеррацид, это крайне ненадежная вещь, и вам стоит подумать дважды, прежде чем использовать ее.
Калеб
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) могут быть полезными в этом отношении.
Одна из причин, по которой это не поддерживается, заключается в том, что каталоги bin / (и аналогичные) используют символические ссылки для указания на конкретные каталоги, в которые установлены реальные исполняемые файлы программ.
Таким образом, если вы $PATHвключаете /usr/local/bin(что, скорее всего, делает), эта папка полна символических ссылок (например ruby), которые указывают на конкретный каталог, где найден код для запуска ruby (например ../Cellar/ruby/2.1.3/bin/ruby).
Вот почему вам не нужно указывать папку каждого исполняемого файла в вашем $PATH; символические ссылки, обычно находящиеся в каталогах bin / type, обрабатывают это для вас.
Ответы:
Добавьте их рекурсивно, используя find следующим образом:
ВНИМАНИЕ: Как уже упоминалось в комментариях к вопросу, это не поощряется, поскольку представляет угрозу безопасности, поскольку нет гарантии, что исполняемые файлы в добавленных каталогах не являются вредоносными.
Вероятно, это лучшее решение, чтобы следовать ответу Жиля и использовать укладку
источник
$PATH
это опасно, но добавление подкаталогов не заметно хуже. Но обычно это бесполезно и, возможно, неэффективно (и иногда может даже привести к ограничению размера среды).~/bin
Или~/scripts
), поэтому его безопасность остается неизменной.~/scripts
. Я не и никто другой не долженОбычная структура каталогов unix имеет файлы приложений, отсортированные по каталогам по видам:
bin
для исполняемых файлов,lib
для библиотек,doc
для документации и так далее. Вот когда они установлены в отдельных каталогах; часто приложения сгруппированы в несколько каталогов (следовательно , многие системы имеют только три директории в$PATH
:/usr/local/bin
,/usr/bin
а/bin
). Редко иметь в каталоге как исполняемые файлы, так и подкаталоги, поэтому нет необходимости включать в них подкаталоги каталога$PATH
.Иногда может быть полезно включить все
bin
подкаталоги подкаталогов данного каталога в$PATH
:Однако это редко делается. Обычный метод, когда должны выполняться исполняемые файлы в нестандартных каталогах,
$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
:Это добавит все подкаталоги $ BINPATH в массив $ PATH.
источник