SSH输出不是行缓冲的吗?


35

我正在像这样的远程计算机上运行脚本:

ssh $host "pip install -r /path/to/requirements.txt"

但是输出不是行缓冲的。当连接终止时,所有的行(〜10)都一次打印,而不是一次返回一行。

这是怎么回事?有什么方法可以强制它们进行行缓冲吗?

(同样,显而易见的是:当我ssh进入$host并“手动”运行命令时,输出如预期那样是行缓冲的)

Answers:



23

为了进一步解释Ryan Fox的答案:许多程序(大多数是-是所有C程序的默认设置)在与终端通信时使用行缓冲stdout,但否则将其完全缓冲。(C标准指定“可以确定不引用交互式设备”时,stdout最初将完全缓冲。)

因此,您看到的是远程运行的程序的输出(如stdout所示)没有行缓冲。ssh只是在获得它时传递它所获得的东西。(我认为ssh实际上在其输出上根本没有缓冲-这是确保用户看到远程程序意图的最不可思议的方法。)


一位匿名用户建议 stdout已完全缓冲,而不是行缓冲
Michael Mrozek

戴夫·范德维斯(Dave Vandervies)带外告诉我说他是进行编辑的人,并且它是正确的(即stdout最初是完全缓冲的,而不是行缓冲的)。
David Wolever

6

为了进一步扩展Ryan Fox的答案,ssh -t这对我也不起作用,但ssh -tt确实有效。请参阅有关-t的ssh手册页:

多个-t选项强制tty分配,即使ssh没有本地tty

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.