我怎么能告诉(在~/.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