GNU/Linux >> Tutoriels Linux >  >> Linux

Supprimer les chemins redondants de la variable $PATH

Voici un code d'une ligne qui nettoie le PATH

  • Cela ne perturbe pas l'ordre du PATH, supprime simplement les doublons
  • Traite :et empth PATH gracieusement
  • Aucun caractère spécial n'est utilisé, donc ne nécessite pas d'échappement
  • Utilise /bin/awk donc ça marche même quand PATH est cassé

    export PATH="$(echo "$PATH" |/bin/awk 'BEGIN{RS=":";}
    {sub(sprintf("%c$",10),"");if(A[$0]){}else{A[$0]=1;
    printf(((NR==1)?"":":")$0)}}')";
    

Vous venez d'exécuter :

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

ce serait pour la session en cours, si vous souhaitez le modifier de manière permanente, ajoutez-le à n'importe quel .bashrc, bash.bashrc, /etc/profile - tout ce qui correspond à votre système et aux besoins de l'utilisateur.

Remarque :Ceci est pour Linux. Nous clarifierons cela pour les nouveaux codeurs. (` , ') N'essayez pas de SET =ceux-ci.


Linux :supprimer les chemins redondants de la variable $PATH

Linux From Scratch a cette fonction dans /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"
}

Ceci est destiné à être utilisé avec ces fonctions pour ajouter au chemin, afin que vous ne le fassiez pas de manière redondante :

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"
}

Une utilisation simple consiste à donner simplement pathremove le chemin du répertoire à supprimer - mais gardez à l'esprit qu'il doit correspondre exactement :

$ pathremove /home/username/anaconda3/bin

Cela supprimera chaque instance de ce répertoire de votre chemin.

Si vous voulez le répertoire dans votre chemin, mais sans les redondances, vous pouvez simplement utiliser l'une des autres fonctions, par ex. - pour votre cas particulier :

$ pathprepend /usr/local/sbin
$ pathappend /usr/local/bin
$ pathappend /usr/sbin
$ pathappend /usr/bin
$ pathappend /sbin
$ pathappend /bin
$ pathappend /usr/games

Mais, à moins que la lisibilité ne soit la préoccupation, à ce stade, vous feriez mieux de simplement faire :

$ export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Est-ce que ce qui précède fonctionnerait dans tous les obus connus de l'homme ?

Je suppose que ce qui précède fonctionne dans sh , dash , et bash au moins. Je serais surpris d'apprendre que cela ne fonctionne pas en csh , fish', or ksh`. Je doute que cela fonctionne dans le shell de commande Windows ou Powershell.

Si vous avez Python, le type de commande suivant devrait faire ce qui est directement demandé (c'est-à-dire supprimer les chemins redondants) :

$ PATH=$( python -c "
import os
path = os.environ['PATH'].split(':')
print(':'.join(sorted(set(path), key=path.index)))
" )

Une ligne (pour éviter les problèmes multilignes) :

$ PATH=$( python -c "import os; path = os.environ['PATH'].split(':'); print(':'.join(sorted(set(path), key=path.index)))" )

Ce qui précède supprime les chemins redondants ultérieurs. Pour supprimer les anciens chemins redondants, utilisez l'index d'une liste inversée et inversez-le à nouveau :

$ PATH=$( python -c "
import os
path = os.environ['PATH'].split(':')[::-1]
print(':'.join(sorted(set(path), key=path.index, reverse=True)))
" )

Si vous utilisez Bash, vous pouvez également effectuer les opérations suivantes si, disons, vous souhaitez supprimer le répertoire /home/wrong/dir/ depuis votre PATH variables :

PATH=`echo $PATH | sed -e 's/:\/home\/wrong\/dir\/$//'`

Linux
  1. Comment définir votre variable $PATH sous Linux

  2. Comment ajouter proprement à $path ?

  3. Comment définir la variable $Path sous Linux

  4. Comment désinstaller aria2 d'Ubuntu

  5. Ajout d'une nouvelle entrée à la variable PATH dans ZSH

Comment ajouter un répertoire à PATH sous Linux

Comment supprimer le mot de passe d'un fichier PDF sous Linux

Comment supprimer une commande de l'historique sous Linux

Comment supprimer les caractères (^M) d'un fichier sous Linux

Comment supprimer les espaces des noms de fichiers sous Linux

Comment supprimer Swap Space de Centos 7.x ?