Схоже, що додаючи каталог у $ PATH, його підкаталоги не додаються рекурсивно. Так я можу це зробити? Або є причина, чому це не підтримується?
Схоже, що додаючи каталог у $ PATH, його підкаталоги не додаються рекурсивно. Так я можу це зробити? Або є причина, чому це не підтримується?
Відповіді:
Додайте їх рекурсивно, використовуючи пошук так:
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
), які вказують на конкретний каталог, де знайдеться код для запуску рубіну (як ../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.