tput:" $ TERM没有值,没有-T指定"当命令在ssh上运行时

时间:2017-08-10 10:48:44

标签: shell tput

我正在所有其他节点上的集群中的主节点上运行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

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

1 个答案:

答案 0 :(得分: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和系统实用程序是允许的自己使用all-caps变量名;只保证小写名称可以安全地供其他应用程序使用)。