2012-10-01 16 views
6

當我嘗試引用bash函數中的兩個進程替換管道時,只有第一個被引用的工作。第二個給出了一個「壞文件描述符」錯誤,像這樣:Bash雙進程替換給出了錯誤的文件描述符

$ foo(){ 
> cat "$1" 
> cat "$2" 
> } 
$ foo <(echo hi) <(echo bye) 
hi 
cat: /dev/fd/62: Bad file descriptor 
$ 

看來,第二管道被丟棄當一個被引用,但一)我似乎無法確認任何文件,這種行爲和b)我希望它不會。 =)

任何想法,我做錯了什麼? FWIW我這樣做是爲了製作一個包裝,使用Mac OS X的FileMerge圖形比較工具而不是命令行工具,它已經很樂意使用命令行中的多個管道。

-Rob

回答

2

你確定你是用bash運行而不是其他shell嗎?你有沒有檢查echo $SHELL的輸出?

工作正常,我使用bash爲:

[16:03:51][[email protected](1)]:~ 
(0)$function foo() { cat "$1"; cat "$2"; }; 
[16:03:59][[email protected](1)]:~ 
(0)$foo <(echo "lva") <(echo hi) 
lva 
hi 

當我的家當變成#/斌/破折號比如我得到的錯誤。

請嘗試在腳本的第一行放置#!/ bin/bash作爲shebang。

+0

這不是一個答案......我剛剛檢查過 - 它在linux上運行並在osx上失敗,這似乎是OP的平臺。 –

4

隨OSX(3.2.48)提供的/bin/bash對此失敗。一個來自macports(4.2.37 - 通常爲/opt/local/bin/bash,如果你有它安裝)工作正常。無論是版本還是版本我都不知道。也許你可能想爲這個腳本使用macports bash。每個mac都必須有macports,所以我假設你這樣做;-)

+0

是的,macports bash爲我修復了它。我會更新我的終端登錄。謝謝! – rharder

5

首先,我認爲@Michael Krelin是正確的關於這與OS X(v3.2.48)提供的bash版本有關。它看起來從我的測試,雖然文件描述符得到的第一個外部命令後丟棄的函數執行:

$ bar() { echo "Args: $*"; echo "First ext command:"; ls /dev/fd; echo "Second ext command:"; ls /dev/fd; } 
$ bar <(echo hi) <(echo bye) 
Args: /dev/fd/63 /dev/fd/62 
First ext command: 
0 1 2 3 4 5 6 62 63 
Second ext command: 
0 1 2 3 4 5 6 

注意的/ dev/FD/62和63消失兩個ls列表之間。我想我找到了一個解決辦法,但:脆弱的FD的複製到非脆弱FD的,他們有機會消失前:

$ baz() { exec 3<"$1" 4<"$2"; ls /dev/fd; ls /dev/fd; cat /dev/fd/3; cat /dev/fd/4; } 
$ baz <(echo hi) <(echo bye) 
0 1 2 3 4 5 6 62 63 
0 1 2 3 4 5 6 
hi 
bye 
+0

真棒解決方法。 是的,抱歉沒有指定,但奇怪的行爲是在OS X 10.8上。 我注意到這種奇怪的行爲也沒有發生在cygwin中。我可能會切換到macports bash,如果這是「正確的」。 – rharder

+0

解決方法爲+1。完全不切實際,但很酷;-) –

相關問題