【问题标题】:Bash interactive and non-interactive shell behaviourBash 交互式和非交互式 shell 行为
【发布时间】:2013-04-16 05:39:31
【问题描述】:

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

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

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

【问题讨论】:

    标签: bash unix interactive-shell


    【解决方案1】:

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

    但是,没有什么可以阻止(例如)那些运行通常不会运行的其他文件的启动文件之一。

    例如,如果.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 之类的内容)以查看从何处调用的内容。

    【讨论】:

      【解决方案2】:

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

      bash -i
      

      所以,通过您调用 bash,您调用了一个非交互式 Bash。

      更多信息

      -一世 如果存在 -i 选项,则 shell 是交互式的。

      【讨论】:

      • 不完全。来自手册页:交互式 shell 是在没有非选项参数且没有 -c 选项的情况下启动的,其标准输入和错误都连接到终端。因此,来自终端的 bash 本身是交互式的。
      猜你喜欢
      • 2016-02-17
      • 1970-01-01
      • 2012-10-18
      • 2017-11-23
      • 1970-01-01
      • 2010-11-26
      • 2012-08-11
      • 2021-09-23
      • 2020-08-17
      相关资源
      最近更新 更多