我如何判断(在 中~/.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 连接到用户来完成你的工作,如果非交互式会话有输出,它将失败