Comment supprimer un chemin du chemin système (`$ PATH`) à l'aide des commandes du terminal?

10

J'ai ajouté un chemin de répertoire au chemin système ( $PATH) en exécutant,

export PATH=$PATH:/home/avinash/Desktop/raj

Maintenant, mon chemin ressemble à ceci,

$ echo $ PATH
/ usr / lib / lightdm / lightdm: / usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin: / usr / games: / usr / local / games : / home / avinash / Bureau / raj

Je souhaite supprimer /home/avinash/Desktop/rajde la variable de chemin d'accès système en utilisant la commande ( comme la commande d'exportation le fait lors de l'ajout de chemin d'accès ).

Avinash Raj
la source
où avez-vous mis la déclaration d'exportation?
souravc
terminal gnome (ctrl + alt + t)
Avinash Raj

Réponses:

14

L'exécution export PATH=$PATH:/...ne définit pas votre PATHsystème à l'échelle. C'est juste une variable shell. Démarrez un nouveau shell et BOOM , c'est parti. Évidemment, si vous l'avez ajouté à ~/.bashrc(ou à un autre fichier d'amorçage d'environnement), vous devrez annuler ce changement, mais cela ne ressemble pas à votre problème ici.

Si vous êtes désespéré de ne pas démarrer un nouveau shell, vous pouvez le définir en le supprimant manuellement, avec:

export PATH=/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
Oli
la source
11

Dans votre shell actuel (votre session actuelle de gnome-terminal), vous pouvez le faire en utilisant:

export PATH=${PATH%:/home/avinash/Desktop/raj}

En général:

${string%substring}

supprime la correspondance la plus courte $substringde l' arrière de $string.

Consultez la manipulation des chaînes pour plus d'informations.

Radu Rădeanu
la source
2

Si vous souhaitez l'utiliser comme commande, voici un petit script:

#!/bin/bash

# This script removes folder from PATH variable
# Folders to remove reading as arguments

if [ $# -lt 1 ]; then
    echo "You should give at least one argument"
    echo "For example"
    echo "$0 /usr/local/bin"
else
    FOLDERS_TO_REMOVE=`echo $@ | sed 's/ /|/g'`

    echo "You actually PATH variable is:"
    echo $PATH
    echo "###"

    PATH=$( echo ${PATH} | tr -s ":" "\n" | grep -vwE "(${FOLDERS_TO_REMOVE})" | tr -s "\n" ":" | sed "s/:$//" )

    echo "Now you need to run"
    echo "export PATH=$PATH"
fi

Nommez-le unexportet ajoutez-le à votre CHEMIN.

Usage:

unexport /usr/local/bin /bin /sbin

Ce script ne change pas votre réalité PATH. Si vous voulez que le script le fasse, vous devez changer la dernière ligne. Remplacer echo "export PATH=$PATH"parexport PATH=$PATH

c0rp
la source
2

Si vous placez l' exportinstruction dans un fichier d'initialisation de shell comme ~/.bashrc, vous pouvez utiliser les commandes suivantes dans le terminal,

#remove the export statement from the file.
sed -i 's#export PATH=$PATH:/home/avinash/Desktop/raj##g' ~/.bashrc
#source ~/.bashrc
. ~/.bashrc

Il supprimera le dossier du chemin.

Si vous avez exporté le chemin depuis un terminal

Le dossier sera dans le chemin tant que vous serez dans ce shell. Pour écraser le chemin, vous devez attribuer un nouveau chemin. Comme oli déjà mentionné dans l'autre réponse.

Vous pouvez utiliser la commande suivante pour définir l'ancien chemin

export PATH=`echo ${PATH/\:\/home\/avinash\/Desktop\/raj/}`

Ou simplement

export PATH=${PATH/':/home/avinash/Desktop/raj'/}

Ceci est le remplacement de sous-chaîne,

${string/substring/replacement}
souravc
la source
2

Un hack sale est

export PATH="$( echo $PATH| tr : '\n' |grep -v raj | paste -s -d: )"
  1. séparez chaque répertoire de votre CHEMIN par ligne en utilisant tr
  2. supprimez ce que vous ne voulez pas (chemin correspondant à "raj") en utilisant grep -v, et
  3. réduire en une longue chaîne délimitée ":" en utilisant paste.

cela ne fonctionnera probablement pas bien si un dir dans PATH a :ou une nouvelle ligne

si vous vous en sortez beaucoup, envisagez d'en faire une fonction et d'enregistrer votre profil shell (par exemple .bashrc, .zshrc)

# use like: rminpath "raj"
rminpath(){ export PATH="$( echo $PATH| tr : '\n' |grep -v "$1" | paste -sd: )"; }
Volonté
la source
1

export PATH=$PATH:/home/avinash/Desktop/raj (Ici, vous avez ajouté le fichier à la variable de chemin d'accès.)

echo $PATH
Si vous exécutez cette commande, voici la sortie:

/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/avinash/Desktop/raj

Comment le supprimez-vous du chemin? il suffit d'exécuter

$ export PATH=${PATH/'/home/avinash/Desktop/raj'/}

C'est un concept de remplacement de chaîne.

$ export PATH=${string/substring/replacement}
Shalom Alexander
la source
0

La commande intégrée du shell exportne détermine pas si une variable est définie ou non, elle détermine si la variable et sa valeur sont également définies dans des sous-processus.

La modification d'une variable, exportée ou non, n'affecte pas le processus parent ou supérieur, donc la changer dans un script n'a aucun effet à moins que ce script ne soit exécuté avec source.

Une fonction shell:

function trimpath {
    PATH=${PATH%:*}
}

supprimera le dernier composant de la variable PATH. Son exportstatut n'est pas affecté.

David Ledger
la source
0

déclarez -x PATH = "/ desire / path / you_want" si je ne me trompe pas, cela mettra à jour ce que vous voulez et c'est à votre entière demande ce que ce sera. [Assurez-vous que vous exécutez en tant que root ET en tant qu'utilisateur souhaité pour lequel vous souhaitez que cette modification affecte]. (Ceci est utilisable pour modifier n'importe quelle sortie que vous obtiendrez lorsque vous exécuterez '/ usr / bin / env'. Bien que je ne sais pas si elle est permanente ou non. À cet égard, faites comme indiqué ci-dessus et modifiez ~ / .bashrc pour à coller)

Jake Baldwin
la source