启动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
不存在 ...