GNU/Linux >> Linux Esercitazione >  >> Linux

Rimuovi i percorsi ridondanti dalla variabile $PATH

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 è rotto

    export 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\/$//'`

Linux
  1. Suggerimenti e trucchi per le variabili di ambiente Linux

  2. Come aggiungere in modo pulito a $ percorso?

  3. Come impostare la variabile $ Path in Linux

  4. Aggiunta di una nuova voce alla variabile PATH in ZSH

  5. Implicazioni sulla sicurezza dell'utilizzo di percorsi relativi nella variabile ambientale PATH?

Come aggiungere una directory a PATH in Linux

Come rimuovere la password da un file PDF in Linux

Come rimuovere un comando dalla cronologia in Linux

Come rimuovere (^M) caratteri da un file in Linux

Come rimuovere gli spazi dai nomi dei file in Linux

Come rimuovere Swap Space da Centos 7.x?