启动bash终端后,我注意到PATH变量包含重复项。我的终端启动了一个登录shell,因此~/.bash_profile是Source,然后是~/.profile和~/.bashrc。仅在~/.profile其中创建重复的路径条目。
要学究一点,这是应该来源的文件的来源顺序:
Sourced /etc/profile
Sourced /etc/bash.bashrc
Sourced .bash_profile
Sourced .profile
Sourced .bashrc在任何人将其标记为“ PATH变量包含重复项”的重复项之前,请继续阅读。
最初,我认为这与~/.profile源两次有关,因此无论何时将文件写入日志文件,都令人惊讶,它仅记录了一个条目,这告诉我它仅源一次。更令人惊讶的是,当我注释掉其中的条目时~/.profile,这些条目仍然出现在PATH变量中。这导致我得出三个结论,其中一个很快就被排除在外:
- Bash会忽略有效的bash注释,但仍会执行注释的代码
- 有一个脚本可以读取~/.profile和忽略任何打印输出的代码(例如,日志文件)
- 我的另一本~/.profile正在其他地方采购
第一个,我很快得出结论,由于进行了一些快速测试,情况并非如此。第二和第三个选项是我需要帮助的地方。
如何在终端启动时收集执行脚本的日志?我echo在检查过的文件中使用过这些文件,以了解它们是否来自bash,但我需要找到一个确定性的方法,该方法可以在终端准备好开始输入时跟踪执行情况。
如果上述方法不可行,那么任何人都可以建议我在哪里可以看到正在运行的脚本。
以后的参考
这是我现在用来添加到我的路径的脚本:
function add_to_path() {
    for path in ${2//:/ }; do
        if ! [[ "${!1}" =~ "${path%/}" ]]; then # ignore last /
            new_path="$path:${!1#:}"
            export "$1"="${new_path%:}" # remove trailing :
        fi
    done
}我这样使用它:
add_to_path 'PATH' "/some/path/bin"脚本在添加变量之前先检查该路径是否已存在。
对于zsh用户,可以使用以下等效项:
function add_to_path() {
    for p in ${(s.:.)2}; do
        if [[ ! "${(P)1}" =~ "${p%/}" ]]; then
            new_path="$p:${(P)1#:}"
            export "$1"="${new_path%:}"
        fi
    done
}编辑28/8/2018
我发现我可以用此脚本做的另一件事是还修复了路径。因此,在.bashrc文件开始时,我会执行以下操作:
_temp_path="$PATH"
PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin'
add_to_path 'PATH' "$_temp_path"
unset _temp_path由您自己决定PATH应以什么开始。PATH首先检查决定。
~/.profile和~/.bashrc从~/.bash_profile
                
~/.profile如果~/.bash_profile不存在 ...