Linux: rimuove 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 è destinato a 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'utilizzo semplice consiste semplicemente nel fornire pathremove
il percorso della directory da rimuovere, ma tieni presente che deve corrispondere esattamente:
$ pathremove /home/username/anaconda3/bin
Ciò 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 esempio - 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 preoccupante, a questo punto è meglio fare semplicemente:
$ export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
Quanto sopra funzionerebbe in tutte le conchiglie conosciute dall'uomo?
Vorrei presumere quanto sopra per il lavoro in sh
, dash
e bash
almeno. Sarei sorpreso di apprendere che non funziona csh
, fish', or
ksh`. Dubito che funzionerebbe nella shell dei comandi di Windows o Powershell.
Se si dispone di 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 evitare problemi multilinea):
$ PATH=$( python -c "import os; path = os.environ['PATH'].split(':'); print(':'.join(sorted(set(path), key=path.index)))" )
Quanto sopra rimuove i percorsi ridondanti successivi. Per rimuovere percorsi ridondanti precedenti, utilizzare l'indice di un elenco invertito e invertirlo di nuovo:
$ PATH=$( python -c "
import os
path = os.environ['PATH'].split(':')[::-1]
print(':'.join(sorted(set(path), key=path.index, reverse=True)))
" )