bash - 子shell IO重定向

标签 bash redirect file-descriptor subshell

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

$ seq 1 10 > "foo.txt"

我正在尝试读取文件的第一行和最后一行,我首先将文件重定向到一个子 shell,这样命令列表将按顺序使用文件——每个命令都使用来自的输入最后一个命令离开它的点,我想:

$ (head -1; tail -1) < "foo.txt"
1
10

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

$ (head -1; tail -1) < <(seq 1 10)
1

问题:

  1. 我不确定要命名什么 <(seq 1 10) ,但是这个临时文件描述符和一个常规文件描述符("foo.txt")之间有什么区别,这会导致子 shell 执行的行为不同?

    <
  2. 我怎样才能实现重定向 "foo.txt" 的相同行为?到子 shell,但没有临时文件——实际上没有创建文件。

最佳答案

这只是一个缓冲问题。尝试:

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只消耗第一页输入,tail 看到最后一行数据。

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

关于bash - 子shell IO重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18982611/

相关文章:

c - 发生错误时如何在makefile中同时退出并记录文件中的数据

狂欢 : Check if file is sorted with sort -c file

bash - wget 是否可以选择强制它写入响应,即使它是错误的?

asp.net-mvc - 使用自定义参数将多个域重定向到同一个 Azure 网站

mysql密码弄乱了我的转储

javascript:检测用户是否被重定向到该页面

iOS 12 - AppAuth 重定向 URL 不触发 AppDelegate

c - 使用 fdopen 时文件描述符错误?

python - psutil.Process 和 lsof 命令差异

c - 文件描述符和文件指针有什么区别?