Come rimuovere un percorso dalla variabile $ PATH nei pesci?


20

Sto usando fish come shell in Debian e di recente (dopo alcuni aggiornamenti) ogni volta che provo ad usare il completamento dei comandi ho:

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

Eseguendo questo:

echo $PATH 

Mi dà questo:

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

Nel mio sistema non c'è /usr/lib/x86_64-linux-gnu/libfm, quindi capisco perché il pesce si sta lamentando, ma non riesco a trovare come rimuovere questo percorso dalla mia $PATHvariabile.

Qualcuno sa come posso farlo?


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

Risposte:


33

Il modo "fish" di impostare la variabile $ PATH è effettivamente utilizzare set --universal fish_user_paths $fish_user_paths /new/path/here. Quindi $ fish_user_paths viene effettivamente anteposto alla variabile $ PATH all'avvio di una nuova sessione. La documentazione $ PATH non ti dice attualmente come eliminarla.

In fish ogni variabile è in realtà un elenco (array) e puoi accedere comodamente a ciascun elemento direttamente utilizzando un indice / indice. echo $fish_user_pathsstamperà una versione spazio delimitato di ogni elemento della lista, rendono gli spazi Newline con la funzione di tradurre echo $fish_user_paths | tr " " "\n"e poi mettere i numeri di riga su di esso con il numero di funzione linee, echo $fish_user_paths | tr " " "\n" | nl. Quindi cancellalo con set --erase --universal fish_user_paths[5]. È necessario utilizzare --universalo non funzionerà in nessuna nuova sessione.

Se qualcuno ha il tempo, si prega di inviare un PR al repository con questo esempio. Ho aperto un problema qui .

TLDR;

  1. echo $fish_user_paths | tr " " "\n" | nl // ottiene il numero di quello che si desidera eliminare, ad esempio il 5 °
  2. set --erase --universal fish_user_paths[5] // cancella universalmente il 5 ° percorso in modo che persista in nuove sessioni

Perché è così arcano? Non dovrebbe essere una funzionalità integrata e aggiunta alla documentazione in modo che le persone non debbano Google e finiscano qui? Oh bene ..
Pär Nils Amsen,

Penso che se prendiamo la risposta di @ clozach qui superuser.com/a/1212305/30982 , che è la funzione addpaths () e removepath (), e apriamo un PR, questo sarebbe il primo passo per ottenerlo aggiunto. La maggior parte dei manutentori è piuttosto brava con cui lavorare, uno mi sembra scontroso, ma nel complesso penso che avremmo buone possibilità. Questo è il nostro prossimo passo.
Elijah Lynn,

9

Come dice Elia, la migliore pratica è modificare il fish_user_pathspiuttosto che il globale PATH. Per evitare di dover mai più ricorrere a Google ...

  1. Crea un paio di funzioni che modificano solofish_user_paths
  2. Effettuare il caricamento automatico di entrambe le funzioni

Per aggiungere ai percorsi utente:

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

Per rimuovere un percorso utente se esiste (credito parziale per questo ):

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

E, naturalmente, per farli caricare automaticamente :

funcsave addpaths; funcsave removepath

Esempio di utilizzo:

> 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

Nota: ho appena scoperto che questo approccio non rimuoverà un percorso aggiunto tramite qualche altro meccanismo; È possibile che sia necessaria una certa pulizia del file dot se si trova un percorso che ritorna ogni volta che si apre una nuova sessione del terminale.
clozach,

Questo è fantastico, appena aggiunto al mio locale!
Elijah Lynn,

3

Questo dovrebbe cancellare i percorsi 6 attraverso l'ultimo percorso:

set -e PATH[6..-1]

Il flag -e è cancellato. Vedere help set.


questo funzionerà solo per la sessione corrente
Daniel
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.