Wie entferne ich einen Pfad aus der $ PATH-Variablen in Fisch?

20

Ich verwende Fisch als meine Shell in Debian und habe vor kurzem (nach einigen Upgrades) immer dann, wenn ich versuche, die Befehlsvervollständigung zu verwenden:

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

Laufen diese:

echo $PATH 

Gibt mir das:

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

In meinem System gibt es keine /usr/lib/x86_64-linux-gnu/libfm, daher verstehe ich, warum sich Fische beschweren, aber ich kann nicht herausfinden, wie ich diesen Pfad aus meiner $PATHVariablen entfernen kann.

Weiß jemand, wie ich das machen kann?

tomekK
quelle
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

Antworten:

32

Die 'Fisch'-Methode zum Setzen der $ PATH-Variablen ist die tatsächliche Verwendung set --universal fish_user_paths $fish_user_paths /new/path/here. Dann wird $ fish_user_paths tatsächlich der $ PATH-Variablen vorangestellt, wenn eine neue Sitzung beginnt. In der $ PATH- Dokumentation wird derzeit jedoch nicht beschrieben, wie Sie sie löschen können.

In fish ist jede Variable eine Liste (Array), und Sie können bequem über einen Index / Index direkt auf jedes Element zugreifen. echo $fish_user_pathsdruckt eine durch Leerzeichen getrennte Version jedes Elements in der Liste aus, setzt die Leerzeichen mit der Funktion "Übersetzen" in eine neue echo $fish_user_paths | tr " " "\n"Zeile und setzt dann mit der Funktion " Zeilenanzahl" Zeilennummern darauf echo $fish_user_paths | tr " " "\n" | nl. Dann löschen Sie es mit set --erase --universal fish_user_paths[5]. Sie müssen verwenden, --universaloder es funktioniert nicht in neuen Sitzungen.

Wenn jemand die Zeit hat, senden Sie bitte eine PR an das Repo mit diesem Beispiel. Ich habe hier eine Ausgabe eröffnet .

tldr;

  1. echo $fish_user_paths | tr " " "\n" | nl // erhalte die Nummer des zu löschenden, zB die fünfte
  2. set --erase --universal fish_user_paths[5] // Den 5. Pfad universell löschen, damit er in neuen Sitzungen erhalten bleibt
Elijah Lynn
quelle
Warum ist das so arkan? Sollte dies nicht eine eingebaute Funktion sein und der Dokumentation hinzugefügt werden, damit die Nutzer nicht Google ausführen und hier landen müssen? Na
ja
Ich denke , wenn wir @ clozach Antwort nehmen hier superuser.com/a/1212305/30982 , die die addpaths ist () und removepath () Funktion, und öffnen Sie eine PR dann , dass der erste Schritt wäre zu bekommen hinzugefügt. Die meisten Betreuer sind ziemlich gut im Umgang, einer scheint mir mürrisch, aber insgesamt denke ich, dass wir eine gute Chance hätten. Das ist also unser nächster Schritt.
Elijah Lynn
9

Wie Elijah sagt, besteht die beste Praxis darin, fish_user_pathseher das als das Globale zu modifizieren PATH. Damit Sie das nicht noch einmal googeln müssen ...

  1. Erstellen Sie einige Funktionen, die nur geändert werdenfish_user_paths
  2. Lasse beide Funktionen automatisch laden

So fügen Sie Benutzerpfade hinzu:

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

So entfernen Sie einen Benutzerpfad, falls vorhanden (teilweise Gutschrift dafür ):

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

Und natürlich, damit sie automatisch geladen werden :

funcsave addpaths; funcsave removepath

Beispiel Verwendung:

> 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
quelle
Hinweis: Ich habe gerade festgestellt, dass bei diesem Ansatz kein Pfad entfernt wird, der über einen anderen Mechanismus hinzugefügt wurde. Einige Bereinigungen von Punktdateien sind möglicherweise in Ordnung, wenn Sie bei jedem Öffnen einer neuen Terminalsitzung einen Pfad finden, der wieder angezeigt wird.
Clozach
Das ist großartig, gerade zu meinem lokalen hinzugefügt!
Elijah Lynn
3

Dies sollte die Pfade 6 durch den letzten Pfad löschen:

set -e PATH[6..-1]

Das Flag -e wird gelöscht. Sehen help set.

alxrsngrtn
quelle
Dies funktioniert nur für die aktuelle Sitzung
Daniel,