我有一个带有颜色的自定义提示(使用 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