2

我在服务器 A 中有一个 shell 脚本,在服务器 B 中有一个 shell 脚本。我的逻辑写得就像 A 中的 shell 脚本被执行,它调用服务器 B 中的一个 shell 脚本并执行它。当 A 执行 B 时,我能够得到所需的结果,但结果也会出现错误。错误信息:

tput: No value for $TERM and no -T specified

我正在使用以下几行来获得彩色输出;

  RED=`tput setaf 1`
  GREEN=`tput setaf 2`
  YELLOW=`tput setaf 3`
  BLUE=`tput setaf 6`
  BOLD=`tput bold`
  RESET=`tput sgr0`

这些行在 A 和 B 的 shell 脚本中都可用。当我通过登录到服务器 B 在 B 中执行 shell 脚本时,所需的输出与颜色一起出现。当我从 A 调用 shell 脚本并执行它时,我得到了想要的结果以及上面提到的错误消息。

你能在这方面提供帮助吗?

仅供参考,我检查"echo $TERM"并输出'xterm'在两个服务器中。

不知道我哪里出错了。

4

4 回答 4

1

我的解决方案:

# 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 是没有意义的 - tput 仍然可以正常工作。

于 2021-06-04T00:11:07.627 回答
0

我们假设两台服务器中的 shell 或环境设置不同,如果可能,您可以通过两台服务器的下一条命令的输出。

ps

这个命令可以帮助我们了解我们正在使用什么样的 shell。

env

这个命令帮助我们了解环境。

于 2018-01-31T07:42:36.517 回答
0

我现在能够成功解决这个问题。

ssh <Server B> "TERM=xterm" <script in ServerB>

所需的输出以颜色返回到 ServerA。

于 2018-01-31T10:23:03.600 回答
0

$TERM当您通过脚本登录时将取消设置。在这种情况下绕过颜色编码,或将选项硬编码为tput. (我强烈建议前者。)

RED=; GREEN=; YELLOW=; BLUE=; BOLD=; RESET=; 
case ${TERM} in
  '') ;;
  *)
      RED=`tput setaf 1`
      GREEN=`tput setaf 2`
      YELLOW=`tput setaf 3`
      BLUE=`tput setaf 6`
      BOLD=`tput bold`
      RESET=`tput sgr0`;;
esac
于 2018-01-31T09:30:50.050 回答