Jak ustawić wszystkie podkatalogi katalogu na $ PATH?

38

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?

Tim
źródło
5
Dlaczego, u licha, potrzebujesz tego?
alex
10
@alex: Jak myślisz, dlaczego nie ma takiej potrzeby?
Tim
4
@ Czasowo powodem, dla którego nie jest „ogólnie” obsługiwany, jest ryzyko bezpieczeństwa i na ogół nie jest potrzebne. Jeśli rekursywnie dodasz katalogi do swojej ścieżki, kto wie, co może się w nim utknąć ... znacznie utrudni to audyt.
ksenoterracid
4
@Tim: To naprawdę zaskakująca i niezwykła rzecz, dlatego chcieć.
alex
8
@alex co z podkatalogami w katalogu bin? Chciałbym organizować skrypty w katalogach w folderze bin.
Andy

Odpowiedzi:

19

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

vschum
źródło
6
Ostrzeżenie: Ta odpowiedź jest technicznie poprawna, ale jak zauważają Alex i Xenoterracide, jest to szalona niepewna rzecz i zdecydowanie powinieneś pomyśleć dwa razy, zanim zaczniesz z niej korzystać.
Caleb
2
Dodaj odpowiedź do ostrzeżenia, dlaczego nie jest to dobra, bezpieczna rzecz w praktyce.
Caleb
3
Nie uważałbym tego za szczególnie niebezpieczne ; dodawanie losowych katalogów $PATHjest 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).
Gilles 'SO - przestań być zły'
3
@Caleb: może szalony, ale dlaczego niepewny? Jeśli ktoś ma dostęp do dodawania złośliwych plików wykonywalnych w podkatalogach, może również dodać je do katalogu nadrzędnego (tj. ~/binLub ~/scripts), więc ich bezpieczeństwo jest takie samo.
MestreLion,
2
Zagrożenie bezpieczeństwa, jeśli pracujesz w środowisku, w którym przypadkowi ludzie mogą dodawać do ciebie złośliwe pliki ~/scripts. Ja nie i nikt też nie powinien
oseiskar
21

Zwykła struktura katalogów uniksowych ma pliki aplikacji posortowane według katalogów: bindla plików wykonywalnych, libbibliotek, docdokumentacji 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/bina /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 binpodkatalogó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, $PATHjest utworzenie dowiązań symbolicznych w katalogu na ścieżce, takiej jak /usr/local/bin. stowNarzędzie (lub xstow) mogą być przydatne w tej dziedzinie.

Gilles „SO- przestań być zły”
źródło
4

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 $PATHdołą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.

jeffmjack
źródło
1

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.

anon_stackoverflock
źródło