是否有人编写过一个 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
答案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 的开头出现一次而不在其他地方出现时,不接受任何替代品。