非登录非交互式bash启动问题

非登录非交互式bash启动问题

我正在学习 bash 的启动文件,我发现了以下链接:

解释 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

如果非交互、非登录bashshell 发现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 启动文件的更多详细信息,可以找到所有场景的完整设置这里

相关内容