web-dev-qa-db-ja.com

$ PATHにない場合は、$ PATHにパスを追加します

bashスクリプトにパスを追加する必要がありますが、複数回実行される可能性があります。

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

そのパスが何度も追加されたくありません。 $PATHに含まれていない場合、どうすれば追加できますか?

34

最初に、追加するパスがすでに変数の一部であるかどうかを確認します。

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

/path/to/addはすでに$PATHの場合、何も起こりません。それ以外の場合は、最初に追加されます。

最後に必要な場合はPATH=${PATH}:/path/to/add代わりに。

編集:この場合、次のようになります。

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

私の古いラボのsysadminには、これに対して気の利いた小さな機能がありました。

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

指定された文字列がすでにPATHにあるかどうかを確認し、必要に応じて末尾または先頭に追加することもできます。

$ 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/

私の~/.profileにこの関数があり、これを使用して$PATHを変更します。

20
terdon

同じ文字列の場合は、次のようにします。

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

これは何度でも行うことができ、$PATHの値は変更されません。

または、それを確認することもできます。

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

GNU sedを使用すると、

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