我编写了一个 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(这可能会证明太小,因此您会得到很多额外空间,或者太大,因此您会得到未对齐的列) 。