Bash

如何使用 bash 將子程序傳遞給命令

  • February 23, 2020

我正在嘗試使用子程序將多個輸出傳遞給命令。這是我的命令(縮短版本):

cat "$1"
one=cat "$1"

的輸出command <(echo "foo")

foo
/dev/fd/63: Permission denied

由於cat "$1"工作,我假設該函式有權讀取子程序的輸出,但是當我嘗試將其放入變數時,權限被拒絕。為什麼會這樣,有什麼辦法可以解決嗎?

你的問題並不完全清楚。但我猜你有一個名為的命令x,它執行以下操作:

cat "$1"
one=$(cat "$1")

現在,當你這樣做時,你x <(echo "foo")會得到一個錯誤。

這是因為<(...)結構是如何工作的。

基本上它執行echo foo並將其輸出連接到臨時文件句柄(/dev/fd/63),然後將其作為參數傳遞。

所以現在你的第一個cat命令讀取整個輸入。這意味著沒有輸入。所以你的第二個 cat命令沒有什麼可讀的。你會得到一個錯誤,因為這個echo過程已經完成並且沒有打開的句柄可以讀取。

在一個簡單的形式中,你已經完成了一個特殊版本的

echo "foo" | {
 cat
 one=$(cat)
}

但具有巧妙的文件處理魔法。

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