如果 shell 在交互模式下运行,我如何检查 bash?

Ale*_*x B 58 shell bash

我怎么知道(in ~/.bashrc)我是否在交互模式下运行,或者说,通过 ssh 执行命令。.bashrc如果是后者,我想避免打印 ANSI 转义序列。

Den*_*son 69

根据man bash

如果 bash 是交互式的,则设置 PS1 并且 $- 包括 i,允许 shell 脚本或启动文件测试此状态。

所以你可以使用:

if [[ $- == *i* ]]
then
    do_interactive_stuff
fi
Run Code Online (Sandbox Code Playgroud)

还:

当一个不是登录 shell 的交互式 shell 启动时,bash 会从 /etc/bash.bashrc 和 ~/.bashrc 读取并执行命令,如果这些文件存在的话。

So~/.bashrc仅用于交互式 shell。有时,人们从~/.bash_profile~/.profile不正确的来源获取它,因为它干扰了预期的行为。如果您想简化公共代码的维护,您应该使用一个单独的文件来包含公共代码,并从两个 rc 文件中独立获取它。

如果登录rc文件没有输出到 stdout 是最好的,例如~/.bash_profile~/.profile因为它会干扰rsync例如的正确操作。

无论如何,测试交互性仍然是一个好主意,因为可能存在不正确的配置。

  • 请注意,$- 可能*包含*一个 i,不一定等于它。我使用`[[ $- =~ i ]] && echo Interactive` (11认同)
  • @AlexHowansky:等式测试中的星号使其成为包含`i`的测试 (2认同)
  • 哦,哇,我什至没有注意到这些,它们在我的显示器上看起来像双引号。可能是时候增大字体大小了。<变老> (2认同)
  • @PiotrDobrogost:[这是一个*优秀*的讨论](http://superuser.com/a/183980/310) shell 启动文件。 (2认同)

小智 20

test工具可以检查这一点(来自手册页):

 -t FD          True if FD is opened on a terminal.
Run Code Online (Sandbox Code Playgroud)

所以你可以使用例如:

 if [ -t 0 ] ; then
    echo stdin is a terminal
   .....
 fi
Run Code Online (Sandbox Code Playgroud)

或者

if [ -t 1 ] ; then
    echo stdout is a terminal
 fi
Run Code Online (Sandbox Code Playgroud)

  • 这也验证了标准输入是 TTY;尽管它可能相关,但它与 shell 的交互模式不同,后者是由 shell 的“-i”标志请求和指示的。 (2认同)

sor*_*rin 12

用:

if tty -s; then echo interactive; fi
Run Code Online (Sandbox Code Playgroud)


chr*_*ris 6

我通常查看程序 tty 的输出。

如果您使用 tty,它会告诉您您使用的是哪个 tty。如果您未处于交互模式,它通常会告诉您诸如“not a tty”之类的信息。

  • 如果您在终端上,tty -s 将设置返回值 0 或 1 否则不给您输出。您可以将其用作 'if tty -s; 然后_interactive; 菲' (4认同)