![Bash 中的程序化进程替换](https://linux22.com/image/1603444/Bash%20%E4%B8%AD%E7%9A%84%E7%A8%8B%E5%BA%8F%E5%8C%96%E8%BF%9B%E7%A8%8B%E6%9B%BF%E6%8D%A2.png)
正如我们在文档中发现的那样,head <(yes) <(yes n)
将首先用临时文件名替换<(yes)
和<(yes n)
,指向管道,该管道将在读取时分别产生yes
或yes 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
运行该命令时临时文件描述符已经被删除。
向您的问题添加一些细节,准确描述您试图做什么,也许有一个解决方案从这个最小的例子中看不出来。