Process-Substitution
誤解流程替換的目的
我想我對流程替換的案例缺少一些理解。我的直覺是,形式的程序替換
<(COMMANDS)
將執行COMMANDS
,然後將程序的結果提供給它所屬的任何命令,因此command1 <(command2)
將評估command2
結果並將其作為第一個參數傳遞給command1
.我認為以下方法會起作用:
$ for i in <(cat list.txt); do echo $i; done
where
list.txt
是一個包含單詞列表的文件(由換行符分隔)。當我執行它時,它只是輸出/dev/fd/63
,我只能假設它就像在程序替換中創建的子shell的輸出的臨時路徑名?我認為上面的方法會奏效,因為我寫的時候效果很好
$ for i in `cat list.txt`; do echo $i; done
我以前從未見過這個```符號,它究竟是什麼意思?我對流程替換缺乏什麼理解?
foo
是命令替換,而不是程序替換。$(foo)
也是命令替換,並且是首選形式,因為它更容易使用嵌套命令替換:$(foo1 $(foo2 $(foo3 ...)))
.使用命令替換
foo
/$(foo)
,輸出 offoo
用作命令行中的單詞。所以for in $(echo a b c)
就好像你用過一樣for i in a b c
。命令替換中的命令首先執行,得到它的輸出,然後輸出用於創建下一個命令行,然後執行,以此類推。欄位拆分、萬用字元擴展等會發生,因此引用是命令替換中的一個重要考慮因素。使用程序替換
<(foo)
/ ,程序>(foo)
的標準輸入/標準輸出作為文件提供,因此cat <(foo)
就像您使用了foo > /some/file
and一樣cat /some/file
,並且tee >(foo)
就像您使用了tee /some/file
and一樣foo < /some/file
。命令同時執行。由於 shell 看不到輸出,因此欄位拆分和萬用字元擴展不是問題。