如何在 bash 中检查 shell 是否以交互模式运行?

如何在 bash 中检查 shell 是否以交互模式运行?

我如何判断(在 中~/.bashrc)我是在交互模式下运行,还是通过 ssh 执行命令。如果.bashrc是后者,我想避免打印 ANSI 转义序列。

答案1

根据man bash

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

因此你可以使用:

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

还:

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

因此,~/.bashrc它只适用于交互式 shell。有时,人们会从~/.bash_profile或中获取它~/.profile,这是不正确的,因为它会干扰预期的行为。如果您想简化通用代码的维护,您应该使用单独的文件来包含通用代码,并从两个 rc 文件中独立获取它。

最好不要从登录rc文件(例如)向 stdout 输出任何内容~/.bash_profile~/.profile因为它可能会干扰rsync例如的正常运行。

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

答案2

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

答案3

使用:

if tty -s; then echo interactive; fi

答案4

这是红帽的做法...猜测这是最快的方法......

if [ "${-#*i}" == "$-" ]; then

意思是获取 bash 参数,删除子字符串,尽可能短,匹配开头和 i 之间的所有内容。然后检查它是否与原始 bash 参数相同。

检查你是否通过使用 sftp 连接到用户来完成你的工作,如果非交互式会话有输出,它将失败

相关内容