选项一:ssh
提供 TTY
传递-tt
给 ssh 以强制它提供 TTY,TERM
如果您不相信 ssh 被配置为隐式执行,则显式传递:
#!/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 和系统实用程序自己使用全大写变量名称;只有小写名称才能保证其他应用程序可以安全使用)。