提示自定义:如何检测没有 tty

提示自定义:如何检测没有 tty

我有一个带有颜色的自定义提示(使用 tput),每次我在服务器中启动非交互式会话时,都会收到一堆错误。
例如,如果我像这样启动非交互式会话:

ssh root@hostname6 "echo 'hello' ; echo $TERM"

我得到的输出是:

hello
xterm
tput: No value for $TERM and no -T specified
tput: No value for $TERM and no -T specified
tput: No value for $TERM and no -T specified
tput: No value for $TERM and no -T specified
tput: No value for $TERM and no -T specified
tput: No value for $TERM and no -T specified
tput: No value for $TERM and no -T specified
stdin: is not a tty

因此,即使会话是非交互式的,$TERM 变量也有一个值。

我必须检测什么情况,以便当我启动非交互式 shell 时省略提示自定义部分??

答案1

在对 PS1 进行赋值时,将评估这些tput命令。由于启动文件是在启动 ssh 会话时处理的,因此即使您的会话不是交互式的,也会进行赋值。您可以对此进行测试,并且仅在实际启动交互式会话时进行赋值。

if [[ $- =~ i ]]
then
    # set PS1 using tput
else
    # set a plain PS1 (or use hard-coded escape sequences)
fi

答案2

Bash 有一个内置的 TTY 测试。我忘了它是什么时候添加的,3.0 版?我认为它比较新。我在脚本中使用它,当从 cron 运行或用户直接运行它时,我需要不同的行为。

if [ -t 0 ]; then
   echo "I'm a TTY"
fi

答案3

将以下内容放在 /etc/bashrc 的开头

[ -z "$PS1" ] && return

答案4

以下是执行此操作的所有 3 种方法的描述:
http://tldp.org/LDP/abs/html/intandnonint.html

相关内容