我想我缺少对流程替换用例的一些理解。我的直觉是,形式的进程替换<(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
我以前从未见过这种`
表示法,它到底是什么意思?我对流程替换缺乏什么理解?
`foo`
是命令替换,而不是进程替换。$(foo)
也是命令替换,并且是首选形式,因为使用嵌套命令替换更容易:$(foo1 $(foo2 $(foo3 ...)))
.使用命令替换
`foo`
/$(foo)
,输出foo
用作命令行中的单词。所以for in $(echo a b c)
就好像你用过一样for i in a b c
。command substitution 中的命令首先被执行,得到它的输出,然后输出被用来创建下一个命令行,然后被执行,等等。字段拆分、通配符扩展等都会发生,因此引用是命令替换中的重要考虑因素。通过进程替换
<(foo)
/ ,进程>(foo)
的标准输入/标准输出作为文件提供,因此cat <(foo)
就像您使用了foo > /some/file
and一样cat /some/file
,并且tee >(foo)
就像您使用了tee /some/file
and一样foo < /some/file
。这些命令是同时执行的。由于 shell 看不到输出,因此字段拆分和通配符扩展不是问题。