如果shell以交互模式运行,如何检查bash?

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

根据man bash

PS1被设置,$ – 包括我如果bash是交互式的,允许一个shell脚本或一个启动文件来testing这个状态。

所以你可以使用:

 if [[ $- == *i* ]] then do_interactive_stuff fi 

也:

当一个不是loginshell的交互式shell被启动时,如果这些文件存在,bash将从/etc/bash.bashrc和〜/ .bashrc中读取和执行命令。

所以~/.bashrc只能用于交互式shell。 有时候,人们从~/.bash_profile~/.profile那里获取它是不正确的,因为它干扰了预期的行为。 如果要简化常见代码的维护,则应该使用单独的文件来包含通用代码,并从两个rc文件中独立地获取代码。

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

无论如何,由于可能存在不正确的configuration,所以testing交互性仍然是一个好主意。

使用:

 if tty -s; then echo interactive; fi 

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

如果你在tty上,它会告诉你你正在使用哪个tty。 如果你不是在交互模式下,它通常会告诉你“不是一个tty”。

test工具可以检查这个(从手册页):

  -t FD True if FD is opened on a terminal. 

所以你可以使用例如:

  if [ -t 0 ] ; then echo stdin is a terminal ..... fi 

要么

 if [ -t 1 ] ; then echo stdout is a terminal fi