以常规方式将目录添加到 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/3768 https://www.linuxjournal.com/article/3935
此addpath
函数仅当路径中不存在条目时才向路径添加条目。delpath -n
从路径中删除所有不存在的目录。
您可以pathfunc.tgz
从 https://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