Bash 中的程序化进程替换

Bash 中的程序化进程替换

正如我们在文档中发现的那样,head <(yes) <(yes n)将首先用临时文件名替换<(yes)<(yes n),指向管道,该管道将在读取时分别产生yesyes no输出,因此输出将是十个y和十个n字符。

但是,以下方法不起作用:

head $(echo "<(yes) <(yes n)")                                                      
head: cannot open '<(yes)' for reading: No such file or directory
head: cannot open '<(yes' for reading: No such file or directory
head: cannot open 'n)' for reading: No such file or directory

如何克服这个问题并让命令echo与任何其他生成的进程替代一起工作?

答案1

带有引号的命令将不起作用,因为进程替换符号在引用时保留其文字值。

你可能会认为

head $(echo <(yes) <(yes n))

可以工作,但这也会失败并显示以下消息:

head: cannot open '/dev/fd/63' for reading: No such file or directory
head: cannot open '/dev/fd/62' for reading: No such file or directory

我认为造成这种情况的原因是在 echo 命令完成后调用 head 命令,因此在head运行该命令时临时文件描述符已经被删除。

向您的问题添加一些细节,准确描述您试图做什么,也许有一个解决方案从这个最小的例子中看不出来。

相关内容