如何将目录添加到$ PATH中,但前提是该目录尚不存在

时间:2018-09-29 03:23:18

标签: linux bash shell scripting

我正在编写脚本来解决我经常遇到的问题。

问题之一是/sbin从路径中丢失。但这并非总是如此,因此,不要像现在这样将其随意添加到.profile.bash_profile.bashrc等中,

echo "export PATH=\"$PATH:/sbin\"" >> ~/.bashrc

..然后随着时间的流逝,最终以多个export PATH开头,最后是:/sbin:/sbin:/sbin:/sbin:/sbin。我该如何处理?

3 个答案:

答案 0 :(得分:4)

这是一种方法:

echo '[[ ":$PATH:" == *:/sbin:* ]] || PATH="$PATH:/sbin"' >> ~/.bashrc

(请注意,在更新已为环境变量的内容时,不需要export。)


工作原理:

答案 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
}