我在 bash 脚本中使用 tput 命令来为文本着色
作为
tput setaf 2
当我从 putty 或控制台运行脚本时,一切正常
但是当我运行一些通过 SSH 运行脚本的外部 WIN 应用程序引擎时,我们在 tput 上收到以下错误
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
请建议我的 bash 脚本中需要设置什么(ENV 或其他)才能使用 tput 命令?
答案1
通过 连接时ssh
,环境变量可能会(也可能不会)传递到远程应用程序。也“WIN应用引擎”很可能TERM
根本就没有设置。
如果TERM
是putty
(或者xterm
,就此而言),它们具有相同的效果:
tput setaf 2
tput -T putty setaf 2
因为使用的控制序列setaf
是相同的。同样,如果TERM
是linux
,这些是相同的
tput setaf 2
tput -T linux setaf 2
用于setaf
将前景(文本)设置为特定值美国国家标准协会(x3.64) 转义序列。您使用的大多数终端都会这样做 - 或者有些终端无法识别任何这些转义序列。由于没有提到应用程序,因此您必须进行实验,看看是否可以“WIN应用引擎”识别那些转义序列。如果是的话,它可能使用相同的美国国家标准协会逃脱,所以你可以这样做
tput -T xterm setaf 2
(当然,putty、linux 和 xterm 之间还有其他区别)。
答案2
这里有几个可能的选择。
tput
除非您有交互式终端会话,否则请勿使用。您可以选择以下任一方法:[[ -t 1 ]] && tput setaf 2 ... # Only set a colour if we have a tty [[ -n "$TERM" ]] && tput setaf 2 ... # Only set a colour if we have a terminal type definition
设置虚拟端子类型。您可以
export TERM=dumb
禁用terminfo
/的大多数功能termcap
。显然,只有在尚未设置终端类型时您才需要执行此操作:[[ -z "$TERM" ]] && export TERM=dumb # Set a dummy terminal type if none set [[ ! -t 1 ]] && export TERM=dumb # Set a dummy terminal type unless a tty
使用这种方法,您不需要更改任何后续代码;您甚至可以在运行应用程序之前设置它,并且它不需要知道任何差异。
答案3
使用 tty 命令来确定您的脚本是从终端执行还是远程执行:
if tty -s
then
# executed only if in a terminal
tput setaf 2
fi
当您在 SSH 会话中指定命令时,将不会执行then
和之间的命令。fi
答案4
这是我对 tput 问题的解决方案:
# when $TERM is empty (non-interactive shell), then expand tput with '-T xterm-256color'
[[ ${TERM}=="" ]] && TPUTTERM='-T xterm-256color' \
|| TPUTTERM=''
declare -r RES='tput${TPUTTERM} sgr0' REV='tput${TPUTTERM} rev'
declare -r fRD='tput${TPUTTERM} setaf 1' bRD='tput${TPUTTERM} setab 1'
declare -r fGN='tput${TPUTTERM} setaf 2' bGN='tput${TPUTTERM} setab 2'
...
echo ${fRD}" RED Message: ${REV} This message is RED REVERSE. "${RES}
echo ${fGN}" GREEN Message: ${REV} This message is GREEN REVERSE. "${RES}
...
这样,无论是交互式 shell 还是非交互式 shell,都没有任何意义 - tput 仍然可以正常工作。