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