Bash
為什麼“echo 123 >(cat)”的輸出中有“/dev/fd/63”?
$ 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
設置了它的外殼選項並且作業控制未啟動)。