Як я можу встановити всі підкаталоги каталогу в $ PATH?


38

Схоже, що додаючи каталог у $ PATH, його підкаталоги не додаються рекурсивно. Так я можу це зробити? Або є причина, чому це не підтримується?


5
Навіщо на землі вам це потрібно?
alex

10
@alex: Як ви вважаєте, чому немає потреби?
Тім

4
@ Підтвердьте, що це не "загалом" підтримується - це ризик для безпеки і, як правило, не потрібен. Якщо ви рекурсивно додаєте до свого каталогу каталоги, хто знає, що може застрягнути там ..., це значно ускладнює аудит.
ксенотерацид

4
@Tim: хочеться по-справжньому дивовижною і незвичною річчю, ось чому.
alex

8
@alex, що робити з підкаталогами в каталозі bin? Я хотів би організувати сценарії в каталогах у папці bin.
Енді

Відповіді:


19

Додайте їх рекурсивно, використовуючи пошук так:

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

ПОПЕРЕДЖЕННЯ. Як зазначається в коментарях до цього питання, це не рекомендується, оскільки це загрожує безпеці, оскільки немає гарантії, що виконувані файли в доданих каталогах не є шкідливими.

Це, ймовірно, краще рішення слідувати Жиля відповідь і використовувати урочище


6
Попередження: Ця відповідь технічно правильна, але, як зазначають Алекс та ксенотерацид, це робити божевільно небезпечно, і вам обов'язково потрібно подумати двічі, перш ніж реально використовувати це.
Калеб

2
Будь ласка, додайте до своєї відповіді попередження про те, чому це не добре, безпечно робити на практиці.
Калеб

3
Я б не вважав це особливо небезпечним ; додавання випадкових каталогів до $PATHнебезпечних, але додавання підкаталогів не гірше. Але це зазвичай марно і, можливо, неефективно (а іноді навіть може натягнути вас на обмеження розміру навколишнього середовища).
Жил 'ТАК - перестань бути злим'

3
@Caleb: можливо, божевільний, але чому небезпечний? Якщо хтось має доступ до додавання зловмисних виконуваних файлів у підкаталоги, він також може додати їх до батьківського dir (тобто, ~/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), які вказують на конкретний каталог, де знайдеться код для запуску рубіну (як ../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.