误解流程替换的目的

误解流程替换的目的

我想我对流程替换的用例缺乏一些理解。我的直觉是,形式的进程替换<(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/fileand cat /some/file,并且tee >(foo)变得好像您使用了tee /some/fileand foo < /some/file。这些命令是同时执行的。由于 shell 看不到输出,因此字段分割和通配符扩展不是问题。

相关内容