gpt4 book ai didi

bash - "(head; tail) < file"是如何工作的?

转载 作者:行者123 更新时间:2023-11-29 08:42:55 25 4
gpt4 key购买 nike

(通过 https://stackoverflow.com/a/8624829/23582 )

如何(head; tail) < file工作?注意 cat file | (head;tail)没有。

此外,为什么 (head; wc -l) < file0对于 wc 的输出?

注意:我了解头部和尾部的工作原理。只是不涉及这些特定调用的微妙之处。

最佳答案

操作系统

对于 OS X,您可以查看 source code for head source code for tail 弄清楚发生了什么。在tail的情况下, 你会想看看 forward.c .

所以,结果是 head没有做任何特别的事情。它只是使用 stdio 读取其输入库,所以它一次读取一个缓冲区并且可能读取太多。这意味着 cat file | (head; tail)不适用于 head 的小文件的缓冲使其读取最后 10 行中的部分(或全部)。

另一方面,tail检查其输入文件的类型。如果是普通文件,tail寻找到最后并向后读取,直到找到足够的行来发出。这就是为什么 (head; tail) < file适用于任何常规文件,无论大小。

Linux

您可以查看 head 的来源和 tail在 Linux 上也是如此,但使用 strace 更容易,像这样:

(strace -o /tmp/head.trace head; strace -o /tmp/tail.trace tail) < file

看看/tmp/head.trace .你会看到 head命令尝试通过从标准输入(文件描述符 0)读取来填充缓冲区(在我的测试中为 8192 字节)。取决于 file 的大小,它可能会或可能不会填充缓冲区。无论如何,我们假设它在第一次读取时读取了 10 行。然后,它使用 lseek将文件描述符备份到第 10 行的末尾,本质上是“未读取”它读取的任何额外字节。这是有效的,因为文件描述符是在一个普通的、可搜索的文件上打开的。所以(head; tail) < file将适用于任何可搜索的文件,但不会生成 cat file | (head; tail)工作。

另一方面,tail 不会(在我的测试中)寻找结尾并向后读取,就像在 OS X 上那样。至少,它不会一直读回文件的开头。

这是我的测试。创建一个 12 行的小输入文件:

yes | head -12 | cat -n > /tmp/file

然后,尝试 (head; tail) < /tmp/file在 Linux 上。我用 GNU coreutils 5.97 得到这个:

     1  y
2 y
3 y
4 y
5 y
6 y
7 y
8 y
9 y
10 y
11 y
12 y

但是在 OS X 上,我明白了:

     1  y
2 y
3 y
4 y
5 y
6 y
7 y
8 y
9 y
10 y
3 y
4 y
5 y
6 y
7 y
8 y
9 y
10 y
11 y
12 y

关于bash - "(head; tail) < file"是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13718242/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com