Zdefiniowałem tę samą ścieżkę w zmiennej $ PATH 6 razy.
Nie wylogowywałem się, żeby sprawdzić, czy zadziałało.
Jak mogę usunąć duplikaty?
Zmienna $ PATH wygląda następująco:
echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin
Jak bym zresetował to do just
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
Odpowiedzi:
Po prostu wykonujesz:
dotyczy to bieżącej sesji, jeśli chcesz zmienić na stałe, dodaj ją do dowolnego pliku .bashrc, bash.bashrc, / etc / profile - cokolwiek pasuje do twojego systemu i potrzeb użytkownika.
Uwaga: dotyczy to systemu Linux. Wyjaśnimy to nowym programistom. (`, ') Nie próbuj ustawiać = tych.
źródło
echo 'export PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games' >> ~/.bashrc
Jeśli używasz Bash, możesz również wykonać następujące czynności, jeśli, powiedzmy, chcesz usunąć katalog
/home/wrong/dir/
ze swojejPATH
zmiennej:źródło
PATH=$(echo $PATH | sed -e 's|:/home/wrong/dir|$||')
echo $PATH | sed -e 's/:\/home\/wrong\/dir\/$//'
) Przed przypisaniem go do PATH.$PATH
. Użyj tego:PATH=$(echo :$PATH: | sed -e 's,:/home/wrong/dir:,:,g' -e 's/^://' -e 's/:$//')
$ PATH=
echo $ PATH | sed -e 's /: \ / scratch \ / sjn \ / anaconda \ / bin \ / python \ / $ //' '`` do usuwania / scratch / sjn / anaconda / bin / pythonLinux From Scratch ma tę funkcję w / etc / profile
Ma to być używane z tymi funkcjami do dodawania do ścieżki, aby nie robić tego nadmiarowo:
Prostym użyciem jest po prostu podanie
pathremove
ścieżki katalogu do usunięcia - ale pamiętaj, że musi ona dokładnie pasować:Spowoduje to usunięcie każdej instancji tego katalogu ze ścieżki.
Jeśli chcesz, aby katalog znajdował się w Twojej ścieżce, ale bez redundancji, możesz po prostu użyć jednej z pozostałych funkcji, np. - w swoim konkretnym przypadku:
Ale o ile czytelność nie jest problemem, w tym momencie lepiej po prostu zrobić:
Czy powyższe zadziałałoby we wszystkich powłokach znanych człowiekowi?
Chciałbym przypuszczać powyższego do pracy w
sh
,dash
ibash
przynajmniej. Byłbym zaskoczony, gdyby się dowiedział, że to nie działacsh
,fish', or
ksh`. Wątpię, czy zadziałaby w powłoce poleceń Windows lub w Powershell.Jeśli masz Pythona, poniższe polecenie powinno zrobić to, o co bezpośrednio zapytano (czyli usunąć nadmiarowe ścieżki):
Jednowierszowy (aby uniknąć problemów wielowierszowych):
Powyższe usuwa później zbędne ścieżki. Aby usunąć wcześniejsze nadmiarowe ścieżki, użyj indeksu odwróconej listy i ponownie go odwróć:
źródło
${!PATHVARIABLE}
jest to rodzaj zmiennej pośredniej, ale nie jestem pewien, jak to działa tutaj. Czy mógłbyś to wyjaśnić?local
wbudowanej (której można używać tylko wewnątrz funkcji). Jeśli masz dalsze pytania, prawdopodobnie powinieneś zadać nowe pytanie na stronie (po wyszukaniu go najpierw, aby upewnić się, że nie tworzysz dokładnego duplikatu ...).Oto jeden wiersz kodu, który czyści PATH
Używa,
/bin/awk
więc działa nawet wtedy, gdy PATH jest uszkodzonyźródło
echo $PATH
PATH= # pass new list of entries
źródło
Jeśli chcesz tylko usunąć zduplikowane ścieżki, używam tego skryptu, który napisałem jakiś czas temu, ponieważ miałem problem z wieloma ścieżkami perl5 / bin:
I umieściłem to w moim ~ / .profile na końcu. Ponieważ używam BASH prawie wyłącznie, nie próbowałem go w innych powłokach.
źródło
|uniq
na,|sort|uniq
aby to naprawić, ale spowoduje to zmianę kolejności wszystkich katalogów w ścieżce, co moim zdaniem nie jest pożądanym efektem ubocznym.Zakładając, że twoja powłoka to Bash, możesz ustawić ścieżkę za pomocą
ale jak powiedział Levon w innej odpowiedzi, jak tylko zakończysz działanie powłoki, zmiany znikną. Prawdopodobnie chcesz skonfigurować swój
PATH
w~/.bash_profile
lub~/.bashrc
.źródło
W bashu możesz po prostu $ {var / find / replace}
Lub w tym przypadku (ponieważ bit wymiany jest pusty) po prostu:
Przyjechałem tutaj pierwszy, ale poszedłem dalej, ponieważ myślałem, że nastąpi rozszerzenie parametrów aby to zrobić. Łatwiejsze niż sed !.
Jak zamienić znak zastępczy lub słowo w zmiennej na wartość z innej zmiennej w Bash?
źródło
%
oznacza dopasowanie, jeśli na końcu łańcucha,#
jest na początku.Nie ma standardowych narzędzi do „edycji” wartości
$PATH
(np. „Dodaj folder tylko wtedy, gdy jeszcze nie istnieje” lub „usuń ten folder”).Aby sprawdzić, jaka byłaby ścieżka podczas następnego logowania, użyj
telnet localhost
(lubtelnet 127.0.0.1
). Następnie poprosi o podanie nazwy użytkownika i hasła.To daje ci nową powłokę logowania (tj. Zupełnie nową, która nie dziedziczy niczego z obecnego środowiska).
Możesz sprawdzić wartość
$PATH
tam i edytować pliki rc, aż będzie poprawna. Jest to również przydatne, aby sprawdzić, czy w ogóle możesz się zalogować ponownie po wprowadzeniu zmiany w ważnym pliku.źródło
/bin/bash -i
. Dużo mniej kłopotów.Jak dodałeś te zduplikowane ścieżki do zmiennej PATH? Musisz edytować jeden ze swoich
.
plików. (.tcshrc
lub.bashrc
, itp., w zależności od konkretnego systemu / powłoki). Aby to naprawić, należy ponownie wyedytować plik i usunąć zduplikowane ścieżki.Jeśli nie edytowałeś żadnych plików i musisz interaktywnie zmodyfikować PATH. W takim przypadku zmiany nie zostaną „zachowane”, tj. Jeśli otworzysz inną powłokę lub wylogujesz się i zalogujesz ponownie, zmiany znikną automatycznie.
Zauważ, że istnieją również pliki konfiguracyjne dla całego systemu, ale jest mało prawdopodobne, że je zmodyfikowałeś, więc najprawdopodobniej będziesz zmieniać pliki w swoim osobistym katalogu domowym (jeśli chcesz, aby te zmiany stały się trwałe po ustaleniu zestawu ścieżek)
źródło
Aby uzyskać łatwy szablon kopiuj-wklej, używam tego fragmentu kodu Perl:
W ten sposób nie musisz uciekać przed ukośnikami dla operatora zastępczego.
źródło