Wygląda na to, że podczas dodawania katalogu do $ PATH jego podkatalogi nie są dodawane rekurencyjnie. Więc mogę to zrobić? Czy istnieje powód, dla którego nie jest to obsługiwane?
Wygląda na to, że podczas dodawania katalogu do $ PATH jego podkatalogi nie są dodawane rekurencyjnie. Więc mogę to zrobić? Czy istnieje powód, dla którego nie jest to obsługiwane?
Odpowiedzi:
Dodaj je rekurencyjnie, używając find like:
PATH=$PATH$( find $HOME/scripts/ -type d -printf ":%p" )
OSTRZEŻENIE: Jak wspomniano w komentarzach do pytania, nie jest to zalecane, ponieważ stanowi zagrożenie bezpieczeństwa, ponieważ nie ma gwarancji, że pliki wykonywalne w dodanych katalogach nie będą złośliwe.
Prawdopodobnie lepszym rozwiązaniem jest podążanie za odpowiedzią Gillesa i użycie stow
$PATH
jest niebezpieczne, ale dodawanie podkatalogów nie jest znacznie gorsze. Ale zwykle jest to bezużyteczne i być może nieefektywne (a czasem może nawet rzucić cię na limity wielkości środowiska).
~/bin
Lub ~/scripts
), więc ich bezpieczeństwo jest takie samo.
~/scripts
. Ja nie i nikt też nie powinien
Zwykła struktura katalogów uniksowych ma pliki aplikacji posortowane według katalogów: bin
dla plików wykonywalnych, lib
bibliotek, doc
dokumentacji i tak dalej. Wtedy są instalowane w osobnych katalogach; często aplikacje są zgrupowane w kilku katalogach (stąd wiele systemów mają tylko trzy katalogi w $PATH
: /usr/local/bin
, /usr/bin
a /bin
). Rzadko zdarza się, aby zarówno pliki wykonywalne, jak i podkatalogi znajdowały się w katalogu, więc nie ma potrzeby dołączania do niego podkatalogów $PATH
.
Czasami przydatne może być włączenie wszystkich bin
podkatalogów podkatalogów danego katalogu do $PATH
:
for d in /opt/*/bin; do PATH="$PATH:$d"; done
Jest to jednak rzadko wykonywane. Zwykłą metodą, w której mają być pliki wykonywalne w niestandardowych katalogach, $PATH
jest utworzenie dowiązań symbolicznych w katalogu na ścieżce, takiej jak /usr/local/bin
. stow
Narzędzie (lub xstow
) mogą być przydatne w tej dziedzinie.
Jednym z powodów, dla których nie jest to obsługiwane, jest to, że katalogi bin / (i podobne) używają dowiązań symbolicznych do wskazania konkretnych katalogów, w których zainstalowane są rzeczywiste pliki wykonywalne programów.
Tak więc, jeśli $PATH
dołączasz /usr/local/bin
(co najprawdopodobniej robi), ten folder jest pełen dowiązań symbolicznych (jak ruby
), które wskazują na konkretny katalog, w którym znajduje się kod do uruchomienia ruby (jak ../Cellar/ruby/2.1.3/bin/ruby
).
Dlatego nie musisz określać folderu każdego pliku wykonywalnego w swoim $PATH
; linki symboliczne zwyczajowo znalezione w katalogach bin / type obsługują to za Ciebie.
W Zsh $ PATH można dołączyć jako tablicę. Możesz użyć globowania powłoki, aby dodać wiele podkatalogów do tablicy $ PATH.
Przykład:
W .zshrc
:
typeset -U PATH path
BINPATH="$HOME/bin"
path+=("$BINPATH" ${BINPATH}/*/)
export PATH
Spowoduje to dołączenie wszystkich podkatalogów $ BINPATH do tablicy $ PATH.