如果目录尚不存在,则将其添加到 $PATH

如果目录尚不存在,则将其添加到 $PATH

是否有人编写过一个 bash 函数,仅当目录尚不存在时才将其添加到 $PATH 中?

我通常使用类似以下命令添加到 PATH:

export PATH=/usr/local/mysql/bin:$PATH

如果我在 .bash_profile 中构建 PATH,则除非我所在的会话是登录会话(这并不总是正确的),否则不会读取它。如果我在 .bashrc 中构建 PATH,则它会与每个子 shell 一起运行。因此,如果我启动终端窗口,然后运行 ​​screen,然后运行 ​​shell 脚本,我会得到:

$ echo $PATH
/usr/local/mysql/bin:/usr/local/mysql/bin:/usr/local/mysql/bin:....

我将尝试构建一个名为的 bash 函数add_to_path(),该函数仅在目录不存在时添加目录。但是,如果有人已经写过(或找到)这样的东西,我就不会花时间去做了。

答案1

从我的.bashrc:

pathadd() {
    if [ -d "$1" ] && [[ ":$PATH:" != *":$1:"* ]]; then
        PATH="${PATH:+"$PATH:"}$1"
    fi
}

请注意,PATH 应该已标记为已导出,因此无需重新导出。这会在添加目录之前检查目录是否存在且是否为目录,您可能并不关心这一点。

此外,这会将新目录添加到路径的末尾;要放在开头,请使用PATH="$1${PATH:+":$PATH"}"而不是上面的PATH=行。

答案2

扩展 Gordon Davisson 的答案,这支持了多个论点

pathappend() {
  for ARG in "$@"
  do
    if [ -d "$ARG" ] && [[ ":$PATH:" != *":$ARG:"* ]]; then
        PATH="${PATH:+"$PATH:"}$ARG"
    fi
  done
}

因此您可以执行 pathappend path1 path2 path3 ...

对于前置,

pathprepend() {
  for ((i=$#; i>0; i--)); 
  do
    ARG=${!i}
    if [ -d "$ARG" ] && [[ ":$PATH:" != *":$ARG:"* ]]; then
        PATH="$ARG${PATH:+":$PATH"}"
    fi
  done
}

与 pathappend 类似,你可以这样做

路径前置 路径1 路径2 路径3 ...

答案3

以下是我的答案这个问题结合Doug Harris函数的结构。它使用Bash正则表达式:

add_to_path ()
{
    if [[ "$PATH" =~ (^|:)"${1}"(:|$) ]]
    then
        return 0
    fi
    export PATH=${1}:$PATH
}

答案4

idempotent_path_prepend ()
{
    PATH=${PATH//":$1"/} #delete any instances in the middle or at the end
    PATH=${PATH//"$1:"/} #delete any instances at the beginning
    export PATH="$1:$PATH" #prepend to beginning
}

当您需要 $HOME/bin 只在 $PATH 的开头出现一次而不在其他地方出现时,不接受任何替代品。

相关内容