首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >子壳IO重定向

子壳IO重定向
EN

Stack Overflow用户
提问于 2013-09-24 13:11:43
回答 1查看 3.4K关注 0票数 11

给定一个文件"foo.txt",该文件创建于:

代码语言:javascript
复制
$ seq 1 10 > "foo.txt"

我试图同时读取文件的第一行和最后一行,我首先将文件重定向到一个子subshell,这样命令列表将按顺序使用该文件--每个命令从最后一个命令离开它的点开始消耗输入,,我想是

代码语言:javascript
复制
$ (head -1; tail -1) < "foo.txt"
1
10

但是,如果我尝试使用临时文件描述符进行相同的操作,则输出是不一样的:

代码语言:javascript
复制
$ (head -1; tail -1) < <(seq 1 10)
1

问题

  1. 我不知道如何命名<(seq 1 10),但是这个临时文件描述符与普通文件描述符("foo.txt")之间有什么不同,这会导致子subshell执行的行为有所不同?
  2. 如何实现将"foo.txt"重定向到子subshell的相同行为,但不需要临时文件--而不实际创建文件。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-24 13:33:22

只是个缓冲问题。尝试:

代码语言:javascript
复制
cat foo.txt | ( head -1; tail -1)

您将(可能)看到相同的东西(head消耗了整个输入)。可能发生的情况是head对常规文件的行为与对管道的行为不同,进程替换( <(cmd)语法的名称)正在创建管道。(在Linux中,来自Gnu coreutils的head做一个lseek来尝试在它输出的最终换行符上重新定位,但是lseek在管道上失败了。)

还试着:

代码语言:javascript
复制
(head -1; tail -1) < <(cat /usr/share/dict/words)

在这里,head只使用输入的第一页,尾巴看到数据的最后一行。

您所看到的行为没有得到很好的定义,因为没有标准规定允许使用多少数据头。如果将head替换为sh -c 'read line; echo "$line"',那么在所有情况下都会得到所需的行为。(或者编写您自己的工具来提供您想要的head行为-打印固定数量的行,而不消耗更多的行。)

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18982611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档