Process-Substitution

誤解流程替換的目的

  • August 20, 2018

我想我對流程替換的案例缺少一些理解。我的直覺是,形式的程序替換<(COMMANDS)將執行COMMANDS,然後將程序的結果提供給它所屬的任何命令,因此command1 <(command2)將評估command2結果並將其作為第一個參數傳遞給command1.

我認為以下方法會起作用:

$ for i in <(cat list.txt); do echo $i; done

wherelist.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/fileand一樣cat /some/file,並且tee >(foo)就像您使用了tee /some/fileand一樣foo < /some/file。命令同時執行。由於 shell 看不到輸出,因此欄位拆分和萬用字元擴展不是問題。

引用自:https://unix.stackexchange.com/questions/422958