我正在所有其他节点上的集群中的主节点上运行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
但是当我在每个节点上单独运行它时,它不会出错并打印水平线。
答案 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变量名;只保证小写名称可以安全地供其他应用程序使用)。