Często modyfikuję mój plik .bashrc, a następnie go pozyskuję. Jednak gdy mam takie rzeczy jak
export PATH="~/bin:~/perl5/bin:$PATH"
w pliku, PATH
zmienna środowiskowa rośnie za każdym razem, gdy plik źródłowy.
Na przykład, przy pierwszym uruchomieniu .bashrc, PATH
zmienna składa się z ~/bin:~/perl5/bin:/usr/bin:/bin
.
Drugi raz składa się z ~/bin:~/perl5/bin:~/bin:~/perl5/bin:/usr/bin:/bin
.
Po raz trzeci składa się z ~/bin:~/perl5/bin:~/bin:~/perl5/bin:~/bin:~/perl5/bin:/usr/bin:/bin
.
Czy istnieje prosty sposób, aby dodawać tylko to, czego jeszcze nie ma w ŚCIEŻCE?
/etc/profile
Debianie Lennym, więc włączam go do mojego.bashrc
.pathmunge /some/path
zostanie umieszczony/some/path
na początku$PATH
ipathmunge /some/path after
zostanie umieszczony/some/path
na końcu$PATH
if ! [[ $PATH =~ (^|:)$1($|:) ]] ; then
.pathmunge /foo before
nie osiąga tego. Lepszym sposobem byłoby dodanie / foo na początku, a następnie usunięcie duplikatów.Miałem ten problem, więc użyłem kombinacji technik wymienionych w pytaniu StackOverflow . Oto, czego użyłem do dedukcji faktycznej zmiennej PATH, która została już ustawiona, ponieważ nie chciałem modyfikować skryptu podstawowego.
Zawsze mogłeś zoptymalizować to trochę bardziej, ale miałem w oryginale dodatkowy kod, aby wyświetlić, co się dzieje, aby upewnić się, że poprawnie ustawia zmienne. Inną rzeczą do odnotowania jest to, że wykonuję następujące czynności
Ma to na celu zapewnienie, że mogę obsługiwać katalogi ze spacjami w (katalogi domowe Samba z nazwami użytkowników Active Directory mogą mieć spacje!)
źródło
/bin
jeśli istnieją inne wpisy, np./usr/bin
ponieważ wyrażenie regularne pasuje, nawet jeśli dwa wpisy nie są takie same!Wyraźnie określ swoją ścieżkę.
źródło
PATH
nie zawsze jest takie samo.Tylko jeden ciąg:
źródło
$PATH
. Lubię umieszczać określone katalogi na początku$PATH
(lubię/home/username
), aby moje osobiste kopie plików wykonywalnych były uruchamiane zamiast wbudowanych ustawień domyślnych.Mogę wymyślić dwa różne sposoby rozwiązania tego problemu. Pierwszym z nich jest uruchomienie .bashrc z linią, która jawnie ustawia podstawową ŚCIEŻKĘ, w ten sposób za każdym razem, gdy ją pobierasz, jest ona resetowana do bazy przed dodaniem dodatkowych katalogów.
Na przykład dodaj:
Alternatywnie możesz sprawdzić element przed dodaniem go do ścieżki. Aby to zrobić, użyłbyś czegoś takiego:
To ostatnie robi się jednak trochę powtarzalne, jeśli dodajesz dużo wpisów, więc staram się trzymać tego pierwszego. Jeśli chcesz tego użyć i planujesz dodać wiele wpisów, dobrze byłoby napisać funkcję bash, aby sobie z tym poradzić.
Uwaga: druga opcja może działać tylko tak, jak napisano w nowoczesnych wersjach bash. Obsługa wyrażeń regularnych nie jest funkcją Bourne Shell (/ bin / sh) i może nie istnieć w innych powłokach. Również użycie cudzysłowów może nie być potrzebne, a nawet powodować problemy w niektórych najnowszych wersjach bash.
źródło
PATH
nie zawsze jest takie samo.if
. Co zaskakujące (dla mnie) łatwo jest przekształcić to w funkcję, któraadd_to_PATH ~/perl5/bin ~/.bin
zapętla argumenty oddzielone spacjami, więc możesz po prostu powiedzieć: unix.stackexchange.com/a/4973/28760 (Myślę, żecase
użyte tam wyrażenie jest bardziej przenośne , ale twójif
jest dla mnie jaśniejszy). EDYTUJ dziwny zbieg okoliczności, że to pytanie dodaje również perl5!Oto moje rozwiązanie:
PATH=$(echo -n $PATH | awk -v RS=: -v ORS=: '!x[$0]++' | sed "s/\(.*\).\{1\}/\1/")
Przyjemna, prosta wkładka, która nie pozostawia śladu:
źródło