提示定制:没有tty时如何检测

Get*_*ree 5 linux shell bash bashrc prompt

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

ssh root@hostname6 "echo 'hello' ; echo $TERM"
Run Code Online (Sandbox Code Playgroud)

我得到的输出是:

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
Run Code Online (Sandbox Code Playgroud)

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

我必须检测什么条件才能在启动非交互式 shell 时省略提示自定义部分?

小智 5

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

if [ -t 0 ]; then
   echo "I'm a TTY"
fi
Run Code Online (Sandbox Code Playgroud)


Den*_*son 1

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

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