防止 $PATH 中的重复条目

May*_*hux 4 command-line environment-variables

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

PATH=$PATH:/new-directory
Run Code Online (Sandbox Code Playgroud)

现在的问题是,如果您向 PATH 添加一个新目录,那么它将在不检查它是否已经在 PATH 中的情况下添加。

例如:

echo $PATH
Run Code Online (Sandbox Code Playgroud)

给出:

/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
Run Code Online (Sandbox Code Playgroud)

现在,如果我添加/usr/bin

PATH=$PATH:/usr/bin
Run Code Online (Sandbox Code Playgroud)

然后 PATH 变为:

/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/bin
Run Code Online (Sandbox Code Playgroud)

所以,如果你能注意到,现在/usr/bin是重复的。

那么,如何在不重复的情况下向 PATH 添加新目录?

Rad*_*anu 7

一个简短的方法是使用:

[[ ":$PATH:" =~ ":/new-directory:" ]] || PATH="/new-directory:$PATH"
Run Code Online (Sandbox Code Playgroud)

说明:

  • 第一个命令,[[条件命令,用于测试。
  • 所述=~二进制运算符则返回0从其中被认为是一个扩展正则表达式右边的字符串从左边的字符串相匹配,否则为1。
  • 如果测试通过(/new-directory在PATH找到),由于||逻辑或控制操作员,第二命令被执行:PATH="/new-directory:$PATH"

观察:

  • 当你将一个字符串变量,即使该字符串是另一个变量你应该总是使用引号:。PATH="/new-directory:$PATH"
  • 一般来说,最好在其他目录的前面而不是后面的 PATH 环境变量中添加一个新目录: 。这是因为 PATH 开头的目录优先于后面的目录。PATH="/new-directory:$PATH"


wal*_*tor 5

我使用 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获取该文件