要测试输出是否为终端,我们可以-t STDOUT
:
if (-t STDOUT) {
# print with terminal control chars
} else {
# just plain print
}
但是当脚本在ssh会话中执行而不是从终端运行时(在我的情况下是Jenkins),-t
测试仍然返回true并且我的输出被控制字符污染了:
ssh user@server "/my/script.pl"
为什么-t
检测到终端?
答案 0 :(得分:1)
我不知道为什么 ssh正在为你分配一个终端 - 即使ssh
的输出发送到终端,我默认不这样做 - 但是传递{{1 ssh将禁用远程端的伪tty创建。
-T
来自$ ssh -t localhost "perl -E'say -t STDOUT ?1:0'"
1
Connection to localhost closed.
$ ssh -T localhost "perl -E'say -t STDOUT ?1:0'"
0
的手册页:
ssh
禁用伪tty分配。
-T
强制伪tty分配。这可以用来执行任意的 远程计算机上基于屏幕的程序,非常有用, 例如实现菜单服务时。多个-t选项强制tty 分配,即使ssh没有本地tty。
答案 1 :(得分:0)
如果你强迫ssh分配一个pty -
,也许会更好来自ssh
手册:
-t
强制伪tty分配。这可用于执行任意基于屏幕的程序 在远程机器上,这可能非常有用,例如实现菜单服务时。 多个-t
选项强制tty分配,即使ssh没有本地tty。
答案越长:-t
(Perl或Bourne shell函数)可靠地检测流是否是“打字机”,但ssh
通常只会分配一个伪电传(pty
在交互式shell中流,而不是在其他程序启动时。
另请参阅RequestTTY
中的.ssh/config
选项。