linux + tput:$TERM 没有值并且没有指定 -T

linux + tput:$TERM 没有值并且没有指定 -T

我在 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根本就没有设置。

如果TERMputty(或者xterm,就此而言),它们具有相同的效果:

tput setaf 2
tput -T putty setaf 2

因为使用的控制序列setaf是相同的。同样,如果TERMlinux,这些是相同的

tput setaf 2
tput -T linux setaf 2

用于setaf将前景(文本)设置为特定值美国国家标准协会(x3.64) 转义序列。您使用的大多数终端都会这样做 - 或者有些终端无法识别任何这些转义序列。由于没有提到应用程序,因此您必须进行实验,看看是否可以“WIN应用引擎”识别那些转义序列。如果是的话,它可能使用相同的美国国家标准协会逃脱,所以你可以这样做

tput -T xterm setaf 2

(当然,putty、linux 和 xterm 之间还有其他区别)。

答案2

这里有几个可能的选择。

  1. 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
    
  2. 设置虚拟端子类型。您可以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 仍然可以正常工作。

相关内容