Ecco un codice di una riga che pulisce il PATH
- Non disturba l'ordine del PERCORSO, rimuove solo i duplicati
- Tratta :e empth PATH con garbo
- Non vengono utilizzati caratteri speciali, quindi non richiede escape
-
Utilizza
/bin/awk
quindi funziona anche quando PATH è rottoexport PATH="$(echo "$PATH" |/bin/awk 'BEGIN{RS=":";} {sub(sprintf("%c$",10),"");if(A[$0]){}else{A[$0]=1; printf(((NR==1)?"":":")$0)}}')";
Devi solo eseguire:
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
quello sarebbe per la sessione corrente, se vuoi cambiarlo in modo permanente aggiungilo a qualsiasi .bashrc, bash.bashrc, /etc/profile - qualunque cosa si adatti al tuo sistema e alle esigenze dell'utente.
Nota:questo è per Linux. Lo chiariremo per i nuovi programmatori. (` , ') Non provare a SET =these.
Linux:Rimuovi i percorsi ridondanti dalla variabile $PATH
Linux From Scratch ha questa funzione in /etc/profile
# Functions to help us manage paths. Second argument is the name of the
# path variable to be modified (default: PATH)
pathremove () {
local IFS=':'
local NEWPATH
local DIR
local PATHVARIABLE=${2:-PATH}
for DIR in ${!PATHVARIABLE} ; do
if [ "$DIR" != "$1" ] ; then
NEWPATH=${NEWPATH:+$NEWPATH:}$DIR
fi
done
export $PATHVARIABLE="$NEWPATH"
}
Questo è pensato per essere utilizzato con queste funzioni per l'aggiunta al percorso, in modo da non farlo in modo ridondante:
pathprepend () {
pathremove $1 $2
local PATHVARIABLE=${2:-PATH}
export $PATHVARIABLE="$1${!PATHVARIABLE:+:${!PATHVARIABLE}}"
}
pathappend () {
pathremove $1 $2
local PATHVARIABLE=${2:-PATH}
export $PATHVARIABLE="${!PATHVARIABLE:+${!PATHVARIABLE}:}$1"
}
L'uso semplice è dare solo pathremove
il percorso della directory da rimuovere, ma tieni presente che deve corrispondere esattamente a:
$ pathremove /home/username/anaconda3/bin
Questo rimuoverà ogni istanza di quella directory dal tuo percorso.
Se vuoi la directory nel tuo percorso, ma senza le ridondanze, puoi semplicemente usare una delle altre funzioni, ad es. - per il tuo caso specifico:
$ pathprepend /usr/local/sbin
$ pathappend /usr/local/bin
$ pathappend /usr/sbin
$ pathappend /usr/bin
$ pathappend /sbin
$ pathappend /bin
$ pathappend /usr/games
Ma, a meno che la leggibilità non sia il problema, a questo punto faresti meglio a fare:
$ export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
Quanto sopra funzionerebbe in tutte le shell conosciute dall'uomo?
Presumo che quanto sopra funzioni in sh
, dash
e bash
almeno. Sarei sorpreso di apprendere che non funziona in csh
, fish', or
ksh`. Dubito che funzionerebbe nella shell dei comandi di Windows o in Powershell.
Se hai Python, il seguente tipo di comando dovrebbe eseguire ciò che viene richiesto direttamente (ovvero rimuovere i percorsi ridondanti):
$ PATH=$( python -c "
import os
path = os.environ['PATH'].split(':')
print(':'.join(sorted(set(path), key=path.index)))
" )
Un one-liner (per eludere i problemi di più righe):
$ PATH=$( python -c "import os; path = os.environ['PATH'].split(':'); print(':'.join(sorted(set(path), key=path.index)))" )
Quanto sopra rimuove i successivi percorsi ridondanti. Per rimuovere percorsi ridondanti precedenti, usa l'indice di un elenco invertito e invertilo di nuovo:
$ PATH=$( python -c "
import os
path = os.environ['PATH'].split(':')[::-1]
print(':'.join(sorted(set(path), key=path.index, reverse=True)))
" )
Se stai usando Bash, puoi anche fare quanto segue se, diciamo, vuoi rimuovere la directory /home/wrong/dir/
dal tuo PATH
variabile:
PATH=`echo $PATH | sed -e 's/:\/home\/wrong\/dir\/$//'`