我正在编写脚本来解决我经常遇到的问题。
问题之一是/sbin
从路径中丢失。但这并非总是如此,因此,不要像现在这样将其随意添加到.profile
,.bash_profile
,.bashrc
等中,
echo "export PATH=\"$PATH:/sbin\"" >> ~/.bashrc
..然后随着时间的流逝,最终以多个export PATH
开头,最后是:/sbin:/sbin:/sbin:/sbin:/sbin
。我该如何处理?
答案 0 :(得分:4)
这是一种方法:
echo '[[ ":$PATH:" == *:/sbin:* ]] || PATH="$PATH:/sbin"' >> ~/.bashrc
(请注意,在更新已为环境变量的内容时,不需要export
。)
工作原理:
[[ expression ]]
,尤其对于==
,请参阅the Bash Reference Manual, § 3.2.4.2 "Conditional Constructs"。
[[ ":$PATH:" == *:/sbin:* ]]
是一个命令,如果:$PATH:
包含:/sbin:
则返回0(=成功),否则返回1(=不成功)。command1 || command2
,请参见the Bash Reference Manual, § 3.2.3 "Lists of Commands"。
[[ ":$PATH:" == *:/sbin:* ]] || PATH="$PATH:/sbin"
是一个命令列表,如果PATH="$PATH:/sbin"
包含:$PATH:
,则运行:/sbin:
,否则运行。{li>
答案 1 :(得分:0)
这可能不是“最佳”解决方案,但我对此很满意。我一直喜欢使用Python执行重复性任务,因为在bash中正确执行它会花费很长时间,而这绝对符合要求。
该想法是检查/sbin
中是否存在$PATH
,并以字符串的开头或结尾或冒号分隔。 grep
甚至扩展测试([[
)都可以很轻松地为您完成此操作,但是对于一般解决方案而言,目标路径可能包含正则表达式控制字符,或者您必须转义部分串。在Python中,它比在bash中更容易:Is it possible to escape regex metacharacters reliably with sed。所以我使用这样的脚本(实际上避免了几乎所有的手动解析):
内向
#/usr/bin/env python
"""
Checks if the sole argument is in the PATH.
Returns 0 if yes, 1 if no. It is an error to pass in more
than one command-line argument.
"""
import sys
from is import get_exec_path
from os path import abspath, normcase
if len(sys.argv) != 2:
raise ValueError('Exactly one command line argument must be provided')
path = [normcase(abspath(p)) for p in get_exec_path()]
sys.exit(sys.argv[1] not in path)
与bash相比,它可以用多种语言实现,但更简单。我刚好熟悉Python。它应该适用于任何合理的版本,甚至可能在2.6之前。它被编写为可以在Unix或Windows上运行,尽管我猜测它在Unix或Windows上并没有真正的用处。像这样使用它:
if inpath /sbin ; then
echo "export PATH=\"$PATH:/sbin\"" >> ~/.bashrc
fi
或
inpath /sbin && echo "export PATH=\"$PATH:/sbin\"" >> ~/.bashrc
答案 2 :(得分:0)
pathmunge
函数已经在/etc/profile
中定义:
pathmunge () {
case ":${PATH}:" in
*:"$1":*)
;;
*)
if [ "$2" = "after" ] ; then
PATH=$PATH:$1
else
PATH=$1:$PATH
fi
esac
}