给定一个文件"foo.txt",该文件创建于:
$ seq 1 10 > "foo.txt"我试图同时读取文件的第一行和最后一行,我首先将文件重定向到一个子subshell,这样命令列表将按顺序使用该文件--每个命令从最后一个命令离开它的点开始消耗输入,,我想是。
$ (head -1; tail -1) < "foo.txt"
1
10但是,如果我尝试使用临时文件描述符进行相同的操作,则输出是不一样的:
$ (head -1; tail -1) < <(seq 1 10)
1问题
<(seq 1 10),但是这个临时文件描述符与普通文件描述符("foo.txt")之间有什么不同,这会导致子subshell执行的行为有所不同?"foo.txt"重定向到子subshell的相同行为,但不需要临时文件--而不实际创建文件。发布于 2013-09-24 13:33:22
只是个缓冲问题。尝试:
cat foo.txt | ( head -1; tail -1)您将(可能)看到相同的东西(head消耗了整个输入)。可能发生的情况是head对常规文件的行为与对管道的行为不同,进程替换( <(cmd)语法的名称)正在创建管道。(在Linux中,来自Gnu coreutils的head做一个lseek来尝试在它输出的最终换行符上重新定位,但是lseek在管道上失败了。)
还试着:
(head -1; tail -1) < <(cat /usr/share/dict/words)在这里,head只使用输入的第一页,尾巴看到数据的最后一行。
您所看到的行为没有得到很好的定义,因为没有标准规定允许使用多少数据头。如果将head替换为sh -c 'read line; echo "$line"',那么在所有情况下都会得到所需的行为。(或者编写您自己的工具来提供您想要的head行为-打印固定数量的行,而不消耗更多的行。)
https://stackoverflow.com/questions/18982611
复制相似问题