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