我正在学习 bash 的启动文件,我发现了以下链接:
然后在链接图中的最后一个分支中,我发现如果 bash 是非登录非交互式的,那么 env 变量应该由环境变量 BASH_ENV 获取,我制作了一个测试文件并写入 BASH_ENV="/home/myusername/ .bare.sh"
.bare.sh 的内容是:
var="the bare environment branch should be reached"
并启动了一个打印 var 的脚本:
echo $var
但启动脚本后没有输出写入
我期望它打印“应该到达裸环境分支”
这里可能有什么问题?
答案1
如果非交互、非登录bash
shell 发现BASH_ENV
在其环境中,它将获取该文件。如果BASH_ENV
未导出,则不会在该 shell 的环境中找到它。
这意味着您要么必须export BASH_ENV
在调用 shell 中,要么使用
BASH_ENV=$BASH_ENV ./myscript.sh
当启动脚本时。
手册中的相关段落bash
:
例如,当 bash 以非交互方式启动时,要运行 shell 脚本,它会
BASH_ENV
在环境中查找变量,如果变量出现在环境中,则扩展其值,并使用扩展后的值作为要读取和执行的文件的名称。 Bash 的行为就像执行了以下命令:if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
但变量的值
PATH
不用于搜索文件名。
因此,简而言之,仅仅BASH_ENV
在交互式 shell 中设置是不够的,它还必须在 shell 脚本的环境中可见。
答案2
非交互式 shell 调用的另一种情况是由远程 shell 守护程序(通常是rshd
)或安全 shell 守护程序进行的调用sshd
进行的调用。引用前述Bash 启动文件手册:
如果 Bash 确定它正在以这种方式非交互地运行,它会从 ~/.bashrc 读取并执行命令(如果该文件存在并且可读)。
在这种情况下,有~/.bashrc
这样的就足够了:
if [ -z "$POSIXLY_CORRECT" ]; then
[ -z "$BASH_ENV" ] && export BASH_ENV="$HOME/.bash_env"
source "$BASH_ENV"
fi
有关 bash 启动文件的更多详细信息,可以找到所有场景的完整设置这里。