小编ant*_*_rh的帖子

头吃额外的字符

预计以下 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)

pipe utilities shell-script text-processing head

15
推荐指数
2
解决办法
1459
查看次数

标签 统计

head ×1

pipe ×1

shell-script ×1

text-processing ×1

utilities ×1