我在这样的远程机器上运行一个脚本:
ssh $host "pip install -r /path/to/requirements.txt"
Run Code Online (Sandbox Code Playgroud)
但输出不是行缓冲的;不是一次返回一行,而是在连接终止时一次性打印所有行 (~10)。
这是怎么回事?有没有办法强制它们被行缓冲?
(另外,声明一下:当我通过 ssh 进入$host
并“手动”运行命令时,输出是行缓冲的,正如预期的那样)
鉴于这个最小的例子
( echo "LINE 1" ; sleep 1 ; echo "LINE 2" ; )
Run Code Online (Sandbox Code Playgroud)
它输出LINE 1
,然后,一秒钟后LINE 2
,如预期的那样输出。
如果我们通过管道将其传输到 grep LINE
( echo "LINE 1" ; sleep 1 ; echo "LINE 2" ; ) | grep LINE
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,行为与前一种情况相同。
如果,或者,我们通过管道将其传输到 cat
( echo "LINE 1" ; sleep 1 ; echo "LINE 2" ; ) | cat
Run Code Online (Sandbox Code Playgroud)
行为再次与预期相同。
但是,如果我们通过管道连接到grep LINE
,然后到cat
,
( echo "LINE 1" ; sleep 1 ; echo …
Run Code Online (Sandbox Code Playgroud) 假设我运行了一些进程:
#!/usr/bin/env bash
foo &
bar &
baz &
wait;
Run Code Online (Sandbox Code Playgroud)
我像这样运行上面的脚本:
foobarbaz | cat
Run Code Online (Sandbox Code Playgroud)
据我所知,当任何进程写入 stdout/stderr 时,它们的输出永远不会交错——stdio 的每一行似乎都是原子的。这是如何运作的?什么实用程序控制每行的原子性?
例如。FreeBSD/archlinux 的默认“界面/控制台”、终端、终端仿真器(如 Xterm)、终端多路复用器(如tmux)、窗口管理器(如awesome)之间有什么区别?Bash 和其他“shell”在哪里适合所有这些?
window-manager terminal-multiplexer terminal-emulator terminal console