Chcę dodać, w ~ / .bashrc, kilka katalogów do mojego $ PATH.
Mój $ PATH jest dość długi, więc trudno jest zobaczyć, jakie katalogi zawiera i w jakiej kolejności.
Wiem, że mogę zmodyfikować mój plik ~ / .bashrc, aby był:
PATH=$PATH:/some/dir
PATH=$PATH:/another/dir:/yet/another
PATH=$PATH:/and/another
...
ułatwiłoby to czytanie. Zastanawiałem się jednak, czy w ciągu ostatnich lat Bash nabył jakąś składnię, która ułatwia określenie długiej ścieżki. Np. Fantazjuję na temat składni podobnej do:
PATH=:((
/some/dir
/another/dir
/yet/another
/and/another
...
))
Wiem, że taka składnia jest nieprawidłowa. Zastanawiałem się, czy jest coś tak łatwego. Jest tu?
PATH=foo:$PATH
wydaje się niewłaściwy, ponieważ utrzymuje wzrost za każdym razem,source ~/.bashrc
a nawetexec bash
nie może pomóc, ponieważ$PATH
jestexport
.Odpowiedzi:
Korzystam z zestawu funkcji wygody do dodawania lub dodawania ścieżki do zmiennej. Funkcje znajdują się w pakiecie dystrybucyjnym dla Basha w pliku contrib o nazwie „pathfuncs”.
Jeśli podasz zmienną jako drugi argument, użyje jej zamiast ŚCIEŻKI.
Dla wygody oto:
Jeśli dodasz je do pliku startowego bash, możesz dodać do PATH w następujący sposób:
Lub podaj inną zmienną:
Używam tej metody w moich plikach rc, stawiając na pierwszym miejscu ścieżki wstępne, a na końcu ścieżki dodatkowe. Sprawia, że wszystkie moje zmiany na ścieżce są łatwe do zrozumienia na pierwszy rzut oka. Kolejną zaletą jest to, że wiersze są na tyle krótkie, że w razie potrzeby mogę dodać końcowy komentarz do wiersza.
Ponieważ są to funkcje, można ich używać interaktywnie z wiersza polecenia, na przykład mówiąc,
add_path $(pwd)
aby dodać bieżący katalog do ścieżki.źródło
del_path .
).OK, wymyśliłem następujące rozwiązanie, które moim zdaniem jest eleganckie (jeśli chodzi o składnię powłoki). Korzysta ze składni tablicy Basha, a także zgrabnego sposobu łączenia elementów:
ALARM!
Okazuje się, że to rozwiązanie ma problem : w przeciwieństwie do rozwiązań @terdon i @Starfish, najpierw nie sprawdza, czy ścieżki są już w PATH. Ponieważ chcę wstawić ten kod do ~ / .bashrc (a nie do ~ / .profile), zduplikowane ścieżki wkradną się do PATH. Więc nie używaj tego rozwiązania (chyba że umieścisz go w ~ / .profile (lub, lepiej, ~ / .bash_profile, ponieważ ma on składnię specyficzną dla Bash)).
źródło
PATH
faktycznie powodować problemy z wydajnością (zwłaszcza, że powłoka buforuje udane wyszukiwania).Korzystam z poniższej funkcji w moim
~/.bashrc
. To coś, co dostałem od sysadmina z mojego starego laboratorium, ale nie sądzę, że je napisał. Po prostu dodaj te linie do swojego~/.profile
lub~/.bashrc
:Ma to różne zalety:
$PATH
jest trywialne:pathmunge /foo/bar
;pathmunge /foo/bar
czy na końcu (pathmunge /foo/bar
po))$PATH
.Plik inicjalizacyjny powłoki zawierałby wtedy coś takiego:
źródło
grep
.eval
, abyś mógł spowodować poważne szkody, jeśli uruchomisz go z niewłaściwym argumentem.grep
, zobacz bugzilla.redhat.com/show_bug.cgi?id=544652#c7Chcę dodać, w ~ / .bashrc, kilka katalogów do mojego $ PATH.
Używam następujących w Cygwin. Powinien działać w innych wersjach bash. Możesz usunąć
unset PATH
kompilację na swoim bieżącymPATH
(jeśli to zrobisz, być może będziesz musiał dowiedzieć się, jak:
poprawnie dodać separatory).Uwaga:
bash
funkcji, ale straciłem ją po awarii dysku.W moim
.bash_profile
:...
W
~/.path_elements
:źródło
Używam tego w moim .bashrc (a także w .zshrc, ponieważ zwykle używam zsh, jeśli jest dostępny zamiast bash). To prawda, że wymaga ręcznego dodawania katalogów, ale zaletą jest to, że podczas aktualizacji mogę kontynuować kopiowanie na nowe serwery i nie martwić się, że PATH na nowym serwerze jest tworzony z nieistniejącymi katalogami.
Robię to samo dla mojej MANPATH:
Oprócz posiadania jednego pliku, który mogę kopiować do systemów w różnych środowiskach bez obawy dodania nieistniejących katalogów do PATH, to podejście ma również tę zaletę, że pozwala mi określić kolejność, w jakiej chcę, aby katalogi pojawiały się w PATH. Ponieważ pierwszy wiersz każdej definicji całkowicie redefiniuje zmienną PATH, mogę zaktualizować plik .bashrc i pobrać go po edycji, aby zaktualizować moją powłokę bez dodawania zduplikowanych wpisów (czego doświadczyłem dawno temu, kiedy po prostu zaczynałem od „ $ PATH = $ PATH: / new / dir ". Dzięki temu otrzymam czystą kopię w żądanej kolejności.
źródło
d="/usr/share/man" ; [ -d "$d" ] && MANPATH="$MANPATH:${d}"
będzie krótszy i łatwiejszy do dodania nowego katalogu (po prostu skopiuj wiersz i edytuj pierwszą część „d = ....”). Jednak w przypadku ŚCIEŻKI myślę, że skończy się zbyt dużo katalogów w ŚCIEŻCE, co nie zawsze jest dobre (co jeśli jakieś polecenie „foo” istnieje na jednej z mniej znanych ścieżek i zrobi coś zupełnie innego tego oczekiwałby zwykły użytkownik?)Jest prosty sposób! Przeczytaj Funkcje powłoki i zmienne ścieżki w Linux Journal , 01 marca 2000 Autor Stephen Collyer
Funkcje pozwalają mi używać nowego typu danych w moim środowisku bash - listy oddzielonych dwukropkami. Oprócz ŚCIEŻKI używam ich do dostosowywania LOCATE_PATH, MANPATH i innych oraz jako ogólny typ danych w programowaniu bash. Oto jak skonfigurowałem swoją ŚCIEŻKĘ (używając funkcji):
Ponieważ link do Linux Journal jest określany jako „uszkodzony”, umieściłem Funkcje ścieżki Bash w pliku .shar na stronie http://pastebin.ubuntu.com/13299528/
źródło