use*_*473 2 process-substitution
我想我对流程替换的用例缺少一些理解。我的直觉是,这种形式的进程替换<(COMMANDS)将执行COMMANDS,然后将程序的结果提供给它所属的任何命令,因此command1 <(command2)将评估command2结果并将其作为第一个参数传递给command1.
我认为以下方法会奏效:
$ for i in <(cat list.txt); do echo $i; done
Run Code Online (Sandbox Code Playgroud)
wherelist.txt是一个包含单词列表的文件(用换行符分隔)。当我运行它时,它只是输出/dev/fd/63,我只能假设它就像在进程替换中创建的子shell的输出的临时路径名?
我认为上面的方法会奏效,因为我写的时候效果很好
$ for i in `cat list.txt`; do echo $i; done
Run Code Online (Sandbox Code Playgroud)
我以前从未见过这个`符号,它到底是什么意思?我对流程替换缺乏什么理解?
`foo`是命令替换,而不是进程替换。$(foo)也是命令替换,并且是首选形式,因为使用嵌套命令替换更容易:$(foo1 $(foo2 $(foo3 ...))).
使用命令替换`foo`/ $(foo), 的输出foo用作命令行中的单词。所以for in $(echo a b c)就好像你用过一样for i in a b c。命令替换中的命令首先执行,获得其输出,然后输出用于创建下一个命令行,然后执行,依此类推。会发生字段拆分、通配符扩展等,因此在命令替换中引用是一个重要的考虑因素。
使用进程替换, <(foo)/ >(foo),进程的 stdin/stdout 作为文件提供,因此cat <(foo)就好像您使用了foo > /some/fileand cat /some/file,tee >(foo)变成好像您已经完成了tee /some/fileand foo < /some/file。这些命令是并发执行的。由于 shell 看不到输出,因此不必担心字段拆分和通配符扩展。