Bash交互式和非交互式shell行为

时间:2013-04-23 06:00:10

标签: bash unix interactive-shell

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

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

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

1 个答案:

答案 0 :(得分:2)

您可以确定的唯一的事物是bash的联机帮助页中显示的内容(请参阅INVOCATION) - 详细列出了每个启动文件的运行情况实例

然而,没有任何东西停止(例如)其中一个运行其他文件的启动文件,这些文件通常不会运行。

举例来说,如果.bash_profile有以下行:

. ~/.profile

它也会运行.profile脚本。

事实上,联机帮助页指出:

  

当以非交互方式启动bash时,为了运行shell脚本,例如,它在环境中查找变量BASH_ENV,如果它出现在那里则展开其值,并使用扩展值作为文件的名称来阅读和执行。 Bash的行为就像执行了以下命令一样:

     

if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi

因此,如果您将启动脚本中的确切行放在~/.bash_profile等交互式shell中,您还将获取BASH_ENV指向的文件。

最好的办法是检查INVOCATION部分,找出哪些文件会运行,然后跟踪它们(脚本顶部有set -x之类的内容),看看从哪里调用的是什么