防止 $PATH 中出现重复条目

防止 $PATH 中出现重复条目

以常规方式将目录添加到 PATH:

PATH=$PATH:/new-directory

现在的问题是,如果您将新目录添加到 PATH,那么它将被添加,而不会检查它是否已经在 PATH 中。

例如:

echo $PATH

给出:

/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

现在如果我添加/usr/bin

PATH=$PATH:/usr/bin

然后 PATH 变成:

/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/bin

因此,如果你能注意到的话,现在/usr/bin是重复的。

那么,如何才能将新目录添加到 PATH 而不重复?

答案1

一种简便的方法是使用:

[[ ":$PATH:" =~ ":/new-directory:" ]] || PATH="/new-directory:$PATH"

解释:

  • 第一个命令,即[[条件命令,用于测试。
  • =~如果右边的字符串(被视为扩展的正则表达式)与左边的字符串匹配,则二元运算符返回 0,否则返回 1 。
  • 如果测试不是/new-directory通过(不是由于在 PATH 中找到了一个命令,所以借助||逻辑或控制运算符,执行了第二条命令:PATH="/new-directory:$PATH".

观察结果:

  • 将字符串分配给变量时应始终使用引号,即使该字符串是另一个变量:。PATH="/new-directory:$PATH"
  • 通常,最好将新目录添加到 PATH 环境变量中的其他目录前面,而不是后面: 。这是因为 PATH 开头的目录优先于后面的目录。PATH="/new-directory:$PATH"

答案2

我使用 Stephen Collyer 的 bash_path_funcs,早在 2000 年的 Linux Journal 中就有描述:

https://www.linuxjournal.com/article/3645 https://www.linuxjournal.com/article/376​​8 https://www.linuxjournal.com/article/3935

addpath函数仅当路径中不存在条目时才向路径添加条目。delpath -n从路径中删除所有不存在的目录。

您可以pathfunc.tgzhttps://web.archive.org/web/20061210054813/http://www.netspinner.co.uk:80/Downloads/pathfunc.tgz

答案3

您可以使用此命令:

if [[ ":$PATH:" != *":/new-directory:"* ]]; then PATH=${PATH}:/new-directory; fi

现在来看上面的例子:

echo $PATH

给出:

/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

现在如果我想添加 /usr/bin:

if [[ ":$PATH:" != *":/usr/bin:"* ]]; then PATH=${PATH}:/usr/bin; fi

您会注意到 PATH 没有改变:

/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

现在添加其他目录示例 /var/www

if [[ ":$PATH:" != *":/var/www:"* ]]; then PATH=${PATH}:/var/www; fi

然后输出echo $PATH给出:

/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/var/www

相关内容