Jak usunąć ścieżkę ze zmiennej $ PATH u ryb?

20

Używam ryb jako powłoki w Debianie, a ostatnio (po pewnym uaktualnieniu) za każdym razem, gdy próbuję użyć poleceń uzupełniających, mam:

set: No such file or directory
set: Could not add component /usr/lib/x86_64-linux-gnu/libfm to PATH.
set: No such file or directory

Uruchamianie tego:

echo $PATH 

Daje mi to:

/usr/lib/x86_64-linux-gnu/libfm /usr/local/bin /usr/bin /bin /usr/local/games /usr/games

W moim systemie nie ma /usr/lib/x86_64-linux-gnu/libfm, więc rozumiem, dlaczego ryby narzekają, ale nie mogę znaleźć sposobu na usunięcie tej ścieżki z mojej $PATHzmiennej.

Czy ktoś wie, jak to zrobić?

tomekK
źródło
grep -R /usr/lib/x86_64-linux-gnu/libfm ~/.config/fish /usr/share/fish??
glenn jackman
$ grep -R / usr / lib / x86_64-linux-gnu / libfm ~ / .config / fish / usr / share / fish /home/superuser/.config/fish/fish_history:grep -R / usr / lib / x86_64- linux-gnu / libfm ~ / .config / fish / usr / share / fish
tomekK

Odpowiedzi:

33

„Rybim” sposobem ustawienia zmiennej $ PATH jest użycie set --universal fish_user_paths $fish_user_paths /new/path/here. Następnie $ fish_user_paths jest faktycznie dołączane do zmiennej $ PATH, gdy rozpoczyna się nowa sesja. Jednak dokumentacja $ PATH nie mówi, jak ją usunąć.

W rybach każda zmienna jest w rzeczywistości listą (tablicą), a do każdego elementu można wygodnie uzyskać dostęp za pomocą indeksu / indeksu. echo $fish_user_pathsbędzie wydrukować spacjami wersję każdego elementu na liście, należy NEWLINE przestrzenie z funkcją przełożenia echo $fish_user_paths | tr " " "\n", a następnie umieścić na niej numery linii z numerem funkcjonować linie echo $fish_user_paths | tr " " "\n" | nl. Następnie usuń za pomocą set --erase --universal fish_user_paths[5]. Musisz użyć, --universalinaczej nie będzie działać w żadnych nowych sesjach.

Jeśli ktoś ma czas, prześlij PR do repozytorium z tym przykładem. Otworzyłem tutaj problem .

tldr;

  1. echo $fish_user_paths | tr " " "\n" | nl // uzyskaj numer tego, który chcesz usunąć, np. piąty
  2. set --erase --universal fish_user_paths[5] // uniwersalnie usuń 5. ścieżkę, aby pozostała w nowych sesjach
Elijah Lynn
źródło
Dlaczego to takie tajemnicze? Czy nie powinna to być funkcja wbudowana i dodana do dokumentacji, aby ludzie nie musieli zgłaszać się do Google i tu kończyć? No cóż ...
Pär Nils Amsen
Myślę, że jeśli weźmiemy odpowiedź @ clozach tutaj superuser.com/a/1212305/30982 , która jest funkcją addpaths () i removepath (), i otworzymy PR, to byłby pierwszy krok do jego dodania. Większość opiekunów jest całkiem niezła w pracy, jeden wydaje mi się zrzędliwy, ale ogólnie myślę, że mielibyśmy dobrą szansę. To jest nasz następny krok.
Elijah Lynn,
9

Jak mówi Eliasz, najlepszą praktyką jest modyfikacja fish_user_pathsraczej niż globalnej PATH. Aby uniknąć konieczności ponownego korzystania z Google…

  1. Utwórz kilka funkcji, które tylko modyfikująfish_user_paths
  2. Ustaw automatyczne ładowanie obu funkcji

Aby dodać do ścieżek użytkownika:

function addpaths
    contains -- $argv $fish_user_paths
       or set -U fish_user_paths $fish_user_paths $argv
    echo "Updated PATH: $PATH"
end

Aby usunąć ścieżkę użytkownika , jeśli istnieje (częściowe kredytowej do tego ):

function removepath
    if set -l index (contains -i $argv[1] $PATH)
        set --erase --universal fish_user_paths[$index]
        echo "Updated PATH: $PATH"
    else
        echo "$argv[1] not found in PATH: $PATH"
    end
end

I oczywiście, aby były ładowane automatycznie :

funcsave addpaths; funcsave removepath

Przykładowe użycie:

> addpaths /etc /usr/libexec
Modifying PATH: /usr/local/bin /usr/bin /bin /usr/sbin /sbin
Updated PATH: /etc /usr/libexec /usr/local/bin /usr/bin /bin /usr/sbin /sbin

> removepath /usr/libexec
Modifying PATH: /etc /usr/libexec /usr/local/bin /usr/bin /bin /usr/sbin /sbin
Updated PATH: /etc /usr/local/bin /usr/bin /bin /usr/sbin /sbin
clozach
źródło
Uwaga: Właśnie odkryłem, że to podejście nie usunie ścieżki dodanej przez inny mechanizm; Niektóre czyszczenie plików kropek może być w porządku, jeśli ścieżka wraca za każdym razem, gdy otwierasz nową sesję terminala.
clozach
To jest świetne, właśnie dodane do mojego lokalnego!
Elijah Lynn
3

To powinno skasować ścieżki 6 do ostatniej ścieżki:

set -e PATH[6..-1]

Flaga -e jest usuwana. Zobaczyć help set.

alxrsngrtn
źródło
będzie to działać tylko w przypadku bieżącej sesji
Daniel