如果Shell以交互模式运行,如何检入bash?


45

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


选择是否打印转义序列最好基于$ TERM值,而不是基于shell的交互性。该变量标识客户端终端的功能,该客户端终端是解释转义序列的部分。
yrk

Answers:


52

根据man bash

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

因此,您可以使用:

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

也:

启动不是登录外壳程序的交互式外壳程序时,如果存在这些文件,则bash从/etc/bash.bashrc和〜/ .bashrc中读取并执行命令。

因此~/.bashrc仅源于交互式外壳。有时,人们会从中获取~/.bash_profile或发现~/.profile它不正确,因为它会干扰预期的行为。如果要简化通用代码的维护,则应使用一个单独的文件来包含通用代码,并独立于两个rc文件获取其源代码。

最好不要从rc诸如~/.bash_profile或的登录文件输出到stdout,~/.profile因为它可能会干扰rsync例如的正确操作。

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


7
请注意,$-可能包含一个i,不一定等于它。我使用[[ $- =~ i ]] && echo interactive
Alex Howansky

1
@AlexHowansky:平等测试中的星号使其成为包含条件的测试i
Dennis Williamson

哦,甚至没有注意到这些,它们在我的显示器上看起来像是双引号。可能是时候增加字体大小了。<
geting

有时,人们会从中获取~/.bash_profile或发现~/.profile它不正确,因为它会干扰预期的行为。您如何看待采购的~/.bashrc距离~/.bash_login?由于登录外壳不必是交互式的,我想这也是不正确的。
Piotr Dobrogost 2014年

1
@PiotrDobrogost:这是对Shell启动文件精彩讨论
丹尼斯·威廉姆森


11

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

不错,并且似乎可以在两个外壳之间移植。测试bash <<< 'test -t 0 && echo Y || echo X'Ybash -c 'test -t 0 && echo Y || echo X'X
kyb

1
这也可以验证标准输入是否为TTY;尽管可以关联,但是它与Shell的交互模式不同,后者是由shell的“ -i”标志请求和指示的。
约克

6

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

如果您使用的是tty,它将告诉您正在使用的tty。如果您不在交互模式下,通常会告诉您“ not tty”之类的信息。


3
如果您在终端上,则tty -s将返回值设置为0,否则将返回值设置为1而不返回输出。您可以将其用作'if tty -s; 然后_interactive; 网络连接”
BillThor

谢谢!自从我需要做这种事情已经很长时间了,我想我忘了一些细节了……
chris
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.