0

我很难使用交互式和非交互式 shell。我不明白哪个是哪个。

例如,我读过非交互式 shell 通常BASH_ENV在启动时检查变量并执行它指向的任何内容。

所以,我所做的就是将 设置BASH_ENV为指向一些只回显 OK 的脚本。然后我bash在终端中输入,这个脚本回显OK。但为什么?我不是通过在终端中键入 bash 来调用另一个 INTERACTIVE shell,而不是相反吗?为什么它执行 bash_env?我在 linux mint maya 上。

4

2 回答 2

2

您唯一可以确定的是手册页中显示的内容(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脚本顶部的类似内容)以查看从何处调用的内容。

于 2013-04-23T06:09:53.500 回答
0

如果没记错的话,Bash 只有在你告诉它的情况下才具有交互性,例如

bash -i

因此,通过调用只是bash调用了非交互式 Bash。

更多信息

-一世

如果存在 -i 选项,则 shell 是交互式的。
于 2013-04-23T06:11:34.540 回答