我想我对流程替换的用例缺乏一些理解。我的直觉是,形式的进程替换<(COMMANDS)
将执行COMMANDS
,然后将程序的结果输入到它所属的任何命令中,因此command1 <(command2)
将评估command2
并将结果作为第一个参数传递到command1
.
我认为以下内容会起作用:
$ for i in <(cat list.txt); do echo $i; done
其中list.txt
是包含单词列表(以换行符分隔)的文件。当我运行它时,它只是输出/dev/fd/63
,我只能假设它就像在进程替换中创建的子 shell 的输出的临时路径名?
我认为上面的方法会起作用,因为当我写的时候它工作得很好
$ for i in `cat list.txt`; do echo $i; done
我以前从未见过这个`
符号,它到底是什么意思?我对流程替代缺乏什么理解?
答案1
`foo`
是命令替换,而不是过程替换。$(foo)
也是命令替换,并且是首选形式,因为使用嵌套命令替换更容易:$(foo1 $(foo2 $(foo3 ...)))
.
通过命令替换`foo`
/ $(foo)
, 的输出foo
将用作命令行中的单词。所以for i in $(echo a b c)
就好像你用过for i in a b c
一样。首先执行命令替换中的命令,获取其输出,然后使用输出创建下一个命令行,然后执行该命令行,依此类推。这允许使用命令或函数来生成将由 for 循环迭代的列表。字段分割、通配符扩展等都会发生,因此引用是命令替换中的一个重要考虑因素。
和流程替代, <(foo)
/ >(foo)
,进程的 stdin/stdout 作为文件提供,因此cat <(foo)
就好像您使用了foo > /some/file
and cat /some/file
,并且tee >(foo)
变得好像您使用了tee /some/file
and foo < /some/file
。这些命令是同时执行的。由于 shell 看不到输出,因此字段分割和通配符扩展不是问题。