如果不在 $PATH 中,则将路径添加到 $PATH

Jér*_*nge 35 scripting bash path shell-script

我需要在bash脚本中添加一个路径,但它可能会被执行多次:

export PATH=${OPENSHIFT_HOMEDIR}/app-root/runtime/bin/:${PATH}
Run Code Online (Sandbox Code Playgroud)

我不想一遍又一遍地添加该路径。如果还没有,我如何添加它$PATH

cha*_*aos 57

首先检查要添加的路径是否已经是变量的一部分:

[[ ":$PATH:" != *":/path/to/add:"* ]] && PATH="/path/to/add:${PATH}"
Run Code Online (Sandbox Code Playgroud)

如果/path/to/add已经在 中$PATH,则什么都不会发生,否则它会被添加到开头。

如果您最终需要它,请改用它PATH=${PATH}:/path/to/add

编辑:在你的情况下,它看起来像这样:

[[ ":$PATH:" != *":${OPENSHIFT_HOMEDIR}/app-root/runtime/bin:"* ]] && PATH="${OPENSHIFT_HOMEDIR}/app-root/runtime/bin:${PATH}"
Run Code Online (Sandbox Code Playgroud)

  • 我花了一分钟才意识到,即使目标路径是 $PATH 中的第一个或最后一个路径,这确实有效。这是因为您在测试之前将 $PATH 用冒号括起来。只是想我会指出这一点,以防其他人也有同样的想法。 (3认同)

ter*_*don 24

我旧实验室中的系统管理员有一个漂亮的小功能:

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

它将检查给定的字符串是否已经在 中,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/
Run Code Online (Sandbox Code Playgroud)

我有这个功能~/.profile并用它来修改我的$PATH.

  • 如果使用 bash(v3.0 或更高版本)可能比 `if [[ "${X}" =~ (^|:)${1}($|:) ]] 更清晰;...` (4认同)