【问题标题】:tput: "No value for $TERM and no -T specified" when command run over sshtput:当命令通过 ssh 运行时,“没有 $TERM 的值并且没有指定 -T”
【发布时间】:2017-08-11 01:01:20
【问题描述】:

我在所有其他节点上从集群中的主节点运行 shell 脚本,

ssh root@"$node_name" 'bash -s' < ./script.sh

script.sh 包含以下用于格式化的行,根据终端的大小添加水平线,

printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' -

这给出错误并且不打印水平线,

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

但是当我在每个节点上单独运行它时,它不会出错并打印水平线。

【问题讨论】:

  • “但是当我在每个节点上单独运行它时”也以 root 身份运行?
  • 是的,在每个节点上都以 root 身份。
  • 你在节点上运行时大概有一个TERM
  • 如果没有终端,设置COLUMNS 毫无意义。

标签: shell tput


【解决方案1】:

选项一:让ssh 提供 TTY

-tt 传递给 ssh 以强制它提供 TTY,如果您不相信 ssh 会被隐式配置,则显式传递 TERM

#!/bin/bash
#      ^^^^- the below printf usage is not available in baseline POSIX sh

printf -v term_q '%q' "$TERM"
ssh -t root@"$node_name" "TERM=$term_q bash -s" < ./script.sh

当然,这只有在您的 ssh 是从终端运行时才有意义。如果它是从 cron 作业运行的,那么您需要一些不同的东西。


选项二:不用一个就凑合

您正在运行的操作仅在终端上下文中才有意义。在没有终端的情况下,不存在终端宽度供tput 查找;并且没有通过TERM 环境变量设置终端类型,因此没有可供它使用的控制序列。

考虑为非交互式使用设置默认值:

# if we have no TERM, and no preexisting COLUMNS, set our own
[[ $TERM || $COLUMNS ]] || COLUMNS=80

...或编写代码来处理案件本身:

# skip this command altogether if we have no TERM or COLUMNS
[[ $TERM || $COLUMNS ]] && printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' -

(请注意,分配给 COLUMNS 并不是特别明确的行为;某些 shell 可能不允许这样做;它们完全符合 POSIX 规范,因为允许 shell 和系统实用程序自己制作使用全部大写的变量名称;只有小写名称才能保证其他应用程序可以安全使用)。

【讨论】:

    猜你喜欢
    • 2017-07-27
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    相关资源
    最近更新 更多