预期以下shell命令仅输出输入流的奇数行:
echo -e "aaa\nbbb\nccc\nddd\n" | (while true; do head -n 1; head -n 1 >/dev/null; done)
但是,它只是打印第一行:aaa
。
与-c
(--bytes
)选项一起使用时不会发生相同的事情:
echo 12345678901234567890 | (while true; do head -c 5; head -c 5 >/dev/null; done)
该命令1234512345
按预期输出。但这仅在该实用程序的coreutils实现中有效head
。该busybox的执行还是吃多余的字符,所以输出正好12345
。
我想这种特定的实现方式是出于优化目的而完成的。您不知道行的结尾,因此不知道需要读取多少个字符。不消耗输入流中多余字符的唯一方法是逐字节读取流。但是一次从流中读取一个字节可能很慢。因此,我想head
将输入流读取到足够大的缓冲区中,然后计算该缓冲区中的行数。
--bytes
使用option 时无法说相同的话。在这种情况下,您知道需要读取多少个字节。因此,您可以准确地读取此字节数,但不能超过此数目。该corelibs实现使用这个机会,但是busybox的一个没有,它仍然比读取所需到缓冲区的字节以上。这样做可能是为了简化实现。
所以这个问题。head
实用程序从输入流中消耗比要求更多的字符是否正确?Unix实用程序是否有某种标准?如果存在,是否指定了这种行为?
聚苯乙烯
您必须按Ctrl+C
停止上面的命令。Unix实用程序不会在超越时失败EOF
。如果您不想按,则可以使用更复杂的命令:
echo 12345678901234567890 | (while true; do head -c 5; head -c 5 | [ `wc -c` -eq 0 ] && break >/dev/null; done)
我并没有为了简单起见。