我很难使用交互式和非交互式 shell。我不明白哪个是哪个。
例如,我读过非交互式 shell 通常BASH_ENV
在启动时检查变量并执行它指向的任何内容。
所以,我所做的就是将 设置BASH_ENV
为指向一些只回显 OK 的脚本。然后我bash
在终端中输入,这个脚本回显OK。但为什么?我不是通过在终端中键入 bash 来调用另一个 INTERACTIVE shell,而不是相反吗?为什么它执行 bash_env?我在 linux mint maya 上。
我很难使用交互式和非交互式 shell。我不明白哪个是哪个。
例如,我读过非交互式 shell 通常BASH_ENV
在启动时检查变量并执行它指向的任何内容。
所以,我所做的就是将 设置BASH_ENV
为指向一些只回显 OK 的脚本。然后我bash
在终端中输入,这个脚本回显OK。但为什么?我不是通过在终端中键入 bash 来调用另一个 INTERACTIVE shell,而不是相反吗?为什么它执行 bash_env?我在 linux mint maya 上。
您唯一可以确定的是手册页中显示的内容(bash
请参阅参考资料INVOCATION
) - 详细列出了每个实例中运行的启动文件。
但是,没有什么可以阻止(例如)其中一个启动文件运行通常不会运行的其他文件。
例如,如果.bash_profile
有以下行:
. ~/.profile
它也会运行.profile
脚本。
事实上,手册页指出:
当 bash 以非交互方式启动时,例如运行一个 shell 脚本,它会在环境中查找变量 BASH_ENV,如果它出现,则扩展其值,并将扩展值用作要读取和执行的文件名. Bash 的行为就像执行了以下命令:
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
因此,如果您将确切的行放在您的启动脚本中用于交互式 shell(如~/.bash_profile
),您还将获取BASH_ENV
.
最好的办法是检查 INVOCATION 部分以找出哪些文件将运行,然后跟踪它们(使用set -x
脚本顶部的类似内容)以查看从何处调用的内容。
如果没记错的话,Bash 只有在你告诉它的情况下才具有交互性,例如
bash -i
因此,通过调用只是bash
调用了非交互式 Bash。
更多信息
-一世 如果存在 -i 选项,则 shell 是交互式的。