在我当前的环境(Fedora35、zsh 用户 shell、oh-my-zsh、pyenv)中,
~/.local/bin
路径中不存在。
问题是“正确”的添加位置在哪里?
有多种选择:
- 〜/.zshrc
- 〜/.zlogin
- 〜/.zshenv
- 〜/.zprofile
或系统范围:
- /etc/zshenv
,的作用是在“ksh”仿真模式下/etc/zprofile
获取标准/etc/profile
, 。/etc/profile.d/*sh
# from /etc/zprofile
# Make /etc/profile happier, and have possible ~/.zshenv options like
# NOMATCH ignored.
#
emulate -L ksh
# source profile
if [ -f /etc/profile ]; then
source /etc/profile
fi
(看:https://apple.stackexchange.com/questions/388622/zsh-zprofile-zshrc-zlogin-what-goes-where)
还有其他的可能性( pam_env
)。
在 Fedora 中,/etc/profile
包含一个检查行块交互的shell(带有选项i
)${-}
:
for i in /etc/profile.d/*.sh /etc/profile.d/sh.local ; do
if [ -r "$i" ]; then
if [ "${-#*i}" != "$-" ]; then
. "$i"
else
. "$i" >/dev/null
fi
fi
done
在该行的测试中,if [ "${-#*i}" != "$-" ]; then
表达式${-#*i}
与循环变量没有关系,但意味着:“从选项列表中删除以( )$i
结尾的起始字符串”并解析为i
#*i
${-}
# with (interactive) zsh
for i in /etc/profile.d/*.sh /etc/profile.d/sh.local ; do echo "<${-#*i}> <$->"; done
<kmsy> <569NRXZghikmsy>
<kmsy> <569NRXZghikmsy>
<kmsy> <569NRXZghikmsy>
# with (interactive) bash
for i in /etc/profile.d/*.sh /etc/profile.d/sh.local ; do echo "<${-#*i}> <$->"; done
<mBHs> <himBHs>
<mBHs> <himBHs>
<mBHs> <himBHs>
<mBHs> <himBHs>
从:https://tldp.org/LDP/abs/html/internalvariables.html
$-
传递给脚本的标志(使用 set)。这最初是 Bash 中采用的 ksh 构造......它的一个可能用途是让脚本自测试它是否是交互式的。
可能是避免多重包含的一种/etc/profile.d/*sh
方法交互的壳。
/etc/bashrc
此案例由for Interactive处理bash
。
# Source global bash config,
# when interactive but not posix or sh mode
if test "$BASH" &&\
test -z "$POSIXLY_CORRECT" &&\
test "${0#-}" != sh &&\
test -r /etc/bashrc
then
# Bash login shells run only /etc/profile
# Bash non-login shells run only /etc/bashrc
# Check for double sourcing is done in /etc/bashrc.
. /etc/bashrc
fi