我使用的是 Fedora,其中所有预装的 shell 显然都支持 bashism:bash --posix
确实如此,甚至如此sh
。不过,当我使用这个函数时,
pathprepend () {
if [[ ":$PATH:" != *":$1:"* ]]; then
PATH="$1${PATH:+":$PATH"}"
fi
}
PATH
从向添加目录~/.profile
,Git 没有发现它。请注意,echo $PATH
在我使用 Git 的 bash 会话中,确实列出了我的目录,我注意到,只是因为我使用了diff-highlight
,所以在该目录中建立了符号链接,而在我开始使用上述pathprepend
函数后,Git 抱怨diff-highlight
缺少了该功能。恢复 POSIX 兼容PATH
设置后,它恢复正常工作。
这让我想知道程序使用什么来读取它们的环境。它们是否都带有自己的机制来执行此操作?它们是否将工作留给某个系统 shell 或库?
编辑
@Bodo,这是我以前常做的~/.profile
:
pathprepend () {
if [[ ":$PATH:" != *":$1:"* ]]; then
PATH="$1${PATH:+":$PATH"}"
fi
}
pathprepend "$HOME/.local/bin"
我说的“POSIX 兼容”是指没有任何暴力倾向。这是我现在所拥有的~/.profile
:
pathprepend () {
case ":$PATH:" in
*":$1:"*)
:;;
*)
PATH="$1${PATH:+":$PATH"}";;
esac
}
pathprepend "$HOME/.local/bin"
两种情况下均~/.profile
来源于~/.bash_profile
,其中包含
# Load the configuration for login sessions of any shell
if [[ -f "$HOME/.profile" ]]; then
source "$HOME/.profile"
else
echo >&2 "$HOME/.bash_profile: $HOME/.profile not found"
fi
# Load the configuration for interactive non-login Bash sessions
case "$-" in *i*)
if [[ -f "$HOME/.bashrc" ]]; then
source "$HOME/.bashrc"
else
echo >&2 "$HOME/.bash_profile: $HOME/.bashrc not found"
fi;;
esac
我没有这样做export
PATH
,因为 Gordon Davisson 在我从中复制函数的答案中解释说“PATH
应该已经标记为已导出,因此不需要重新导出。” 事实上,我仍然不知道,export
但使用case
的版本pathprepend
一切正常。顺便问一下,Git 进程的父进程是什么,它是我使用的 Bash 进程吗git
?