Ich verwende Fish als meine Shell in Debian und seit kurzem (nach einigen Upgrades) erhalte ich Folgendes, 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
Folgendes ausführen:
echo $PATH
Gibt mir dies:
/usr/lib/x86_64-linux-gnu/libfm /usr/local/bin /usr/bin /bin /usr/local/games /usr/games
In meinem System gibt es kein /usr/lib/x86_64-linux-gnu/libfm
, daher verstehe ich, warum Fish sich beschwert, aber ich kann nicht herausfinden, wie ich diesen Pfad aus meiner $PATH
Variable entfernen kann.
Weiß jemand, wie ich das machen kann?
Antwort1
Die 'fish'-Methode zum Setzen der $PATH-Variable besteht darin, tatsächlich zu verwenden set --universal fish_user_paths $fish_user_paths /new/path/here
. Dann wird $fish_user_paths tatsächlich der $PATH-Variable vorangestellt, wenn eine neue Sitzung beginnt. Die $PATHDokumentationsagt Ihnen derzeit jedoch nicht, wie Sie es löschen können.
In Fish ist jede Variable eigentlich eine Liste (ein Array), und Sie können bequem über einen Index/Index direkt auf jedes Element zugreifen. echo $fish_user_paths
druckt eine durch Leerzeichen getrennte Version jedes Elements in der Liste aus, macht die Leerzeichen mit der Funktion „translate“ zu Zeilenumbrüchen echo $fish_user_paths | tr " " "\n"
und nummeriert sie dann mit der Funktion „number lines“, echo $fish_user_paths | tr " " "\n" | nl
. Löschen Sie sie dann mit set --erase --universal fish_user_paths[5]
. Sie müssen verwenden --universal
, sonst funktioniert es in keiner neuen Sitzung.
Wenn jemand Zeit hat, bitte eine PR an dierepomit diesem Beispiel. Ich habe ein Problem eröffnetHier.
kurz und knapp;
echo $fish_user_paths | tr " " "\n" | nl
// Holen Sie sich die Nummer derjenigen, die Sie löschen möchten, z. B. die 5.set --erase --universal fish_user_paths[5]
// den 5. Pfad universell löschen, damit er in neuen Sitzungen erhalten bleibt
Antwort2
Wie Elijah sagt, ist es am besten, das zu ändern, fish_user_paths
nicht das globale PATH
. Um das nie wieder googeln zu müssen …
- Erstellen Sie einige Funktionen, dienur ändern
fish_user_paths
- Machen Sie beide Funktionenautomatisches 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 wenn es existiert(Teilgutschrift fürDas):
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, um sieautomatisches Laden:
funcsave addpaths; funcsave removepath
Anwendungsbeispiel:
> 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
Antwort3
Dadurch sollten die Pfade 6 bis zum letzten Pfad gelöscht werden:
set -e PATH[6..-1]
Das Flag -e ist Löschen. Siehe help set
.
Antwort4
Zurücksetzenfish_user_pathsohne den Weg, den Sie nicht mehr wollen:
$ set -U fish_user_paths /usr/local/bin /usr/bin /bin /usr/local/games /usr/game
Mehr Info:https://fishshell.com/docs/current/tutorial.html#tut_path