web-dev-qa-db-fra.com

Ajouter un chemin d'accès à $ PATH s'il n'est pas déjà dans $ PATH

J'ai besoin d'ajouter un chemin dans un script bash, mais il peut être exécuté plusieurs fois:

export PATH=${OPENSHIFT_HOMEDIR}/app-root/runtime/bin/:${PATH}

Je ne veux pas que ce chemin soit ajouté encore et encore. Comment puis-je l'ajouter s'il n'est pas dans $PATH encore?

34
Jérôme Verstrynge

Vérifiez d'abord si le chemin à ajouter fait déjà partie de la variable:

[[ ":$PATH:" != *":/path/to/add:"* ]] && PATH="/path/to/add:${PATH}"

Si /path/to/add est déjà dans le $PATH, alors rien ne se passe, sinon il est ajouté au début.

Si vous en avez besoin à la fin, utilisez PATH=${PATH}:/path/to/add au lieu.

Edit : Dans votre cas, cela ressemblerait à ceci:

[[ ":$PATH:" != *":${OPENSHIFT_HOMEDIR}/app-root/runtime/bin:"* ]] && PATH="${OPENSHIFT_HOMEDIR}/app-root/runtime/bin:${PATH}"
53
chaos

L'administrateur système de mon ancien laboratoire avait une fonction astucieuse pour cela:

pathmunge () {
        if ! echo "$PATH" | /bin/grep -Eq "(^|:)$1($|:)" ; then
           if [ "$2" = "after" ] ; then
              PATH="$PATH:$1"
           else
              PATH="$1:$PATH"
           fi
        fi
}

Il vérifie à la fois si la chaîne donnée est déjà dans le PATH et vous permet également de l'ajouter à la fin ou au début comme vous le souhaitez:

$ echo $PATH
/usr/local/bin:/usr/bin:/bin
$ pathmunge /sbin/             ## Add to the start; default
$ echo $PATH
/sbin/:/usr/local/bin:/usr/bin:/bin
$ pathmunge /usr/sbin/ after   ## Add to the end
$ echo $PATH
/sbin/:/usr/local/bin:/usr/bin:/bin:/usr/sbin/

J'ai cette fonction dans mon ~/.profile et l'utiliser pour modifier mon $PATH.

20
terdon

Si c'est la même chaîne, faites-le:

set -a -- "$OPENSHIFT_HOMEDIR/app-root/runtime/bin/"
PATH=$1:${PATH#"$1:"}
set +a --

Vous pouvez le faire encore et encore et la valeur de $PATH ne changera pas.

Vous pouvez également le vérifier.

set -a -- "$OPENSHIFT_HOMEDIR/app-root/runtime/bin/"
case :${PATH:=$1}: in
(*:"$1":*) ;; (*)
    PATH=$1:$PATH
esac;  set +a --
3
mikeserv

Avec GNU sed vous pouvez le faire en

echo ${PATH} | 
    sed "\|${OPENSHIFT_HOMEDIR}/app-root/runtime/bin|\
        ! s|^|export PATH=${OPENSHIFT_HOMEDIR}/app-root/runtime/bin:|e"
1
Costas