输入重定向行为不一致

输入重定向行为不一致

我编写了一个 10000010 字节的文件(99010 行,每行 100 个连续的a),命名big用于实验目的。然后,我将整个文本复制到剪贴板中,运行wc并将其粘贴到 中stdin。接下来,我做了一个简单的重定向,应该具有完全相同的效果。但这就是我得到的:

$ wc[Enter]
[paste 99010 lines of garbage copied directly from `big']
  99010   99010 10000010
$ wc < big
   99010    99010 10000010

注意不同的字段宽度。我最好的猜测是第一个结果是打印的"%7d %7d %7d",第二个结果是打印的"%8d %8d %8d"

有人可以解释一下这怎么可能吗?我的印象是,就wc第二个实验而言,输入也来自stdin(因为 shell 负责处理< big,所以wc甚至不应该知道我输入了该内容),所以理论上wc应该这样做同样的事情两次,但显然不是。我对重定向有什么不明白的地方?

编辑:我认为这并不重要,但我确实将$ cat big | xclip -selection clipboard数据复制到剪贴板中,然后我只需右键单击 gnome-terminal 并将其粘贴进去。以防万一有人想在他们的计算机上尝试这个。

答案1

GNU coreutils 的 wc 实现尝试优化列的宽度。如果您仅传递常规文件(无论是标准输入还是按名称),它会读取每个文件的每个目录条目以了解文件大小,并且它知道要打印的所有数字都小于或等于总和文件的大小。对于常规文件,wc 会相应地调整列的宽度。如果至少有一个输入文件不是常规文件,GNU wc 使用默认宽度 7(这可能会证明太小,因此您会得到很多额外空间,或者太大,因此您会得到未对齐的列) 。

相关内容