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?
@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
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.
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.
Odpowiedzi:
Dodaj je rekurencyjnie, używając find like:
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
źródło
$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 powinienZwykł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
: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 (lubxstow
) mogą być przydatne w tej dziedzinie.źródło
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 (jakruby
), 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.źródło
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
:Spowoduje to dołączenie wszystkich podkatalogów $ BINPATH do tablicy $ PATH.
źródło