Bash

為什麼“echo 123 >(cat)”的輸出中有“/dev/fd/63”?

  • September 14, 2018
$ echo 123 | cat 
123

正在做我所期望的,兩個命令都在同一個 shell 中執行。

但是當我將它們與>( ... )表達式連接時,該表達式將 shell 中一個命令的輸出連接到子 shell 中的第二個命令,我得到了:

$ echo 123 >(cat)
123 /dev/fd/63

其他值也是如此:

$ echo 101 >(cat)
101 /dev/fd/63

$ echo $BASHPID >(cat)
3252 /dev/fd/63

我認為command1 >(command2)與 相同command1 | command2,但在 中command1 >(command2),每個命令都在不同的 shell 中,因此它們應該具有相同的輸出。我哪裡錯了?

程序替換>(thing)將替換為文件名。這個文件名對應於一個連接到thing內部替換的標準輸入的文件。

以下將是其使用的更好範例:

$ sort -o >(cat -n >/tmp/out) ~/.profile

這將對文件進行排序~/.profile並將輸出發送到該輸出cat -n將列舉行並將結果儲存在/tmp/out.

所以,回答你的問題:你得到那個輸出是因為echo得到了兩個參數123/dev/fd/63. 是程序替換中/dev/fd/63連接到程序標準輸入的文件。cat

稍微修改您的範常式式碼:

$ echo 101 > >(cat)

這將只101在標準輸出上產生(的輸出echo將被重定向到作為輸入的文件,cat並將cat在標準輸出上產生該文件的內容)。


另請注意,在cmd1 | cmd2管道中,cmd2可能根本不會在相同的 shell 中執行cmd1(取決於您使用的 shell 實現)。 ksh93按照您描述的方式工作(相同的外殼),同時bash創建一個子外殼cmd2(除非lastpipe設置了它的外殼選項並且作業控制未啟動)。

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