2012-10-01 36 views
6

देता है जब मैं बैश फ़ंक्शन में दो प्रक्रिया प्रतिस्थापन पाइप को संदर्भित करने का प्रयास करता हूं, केवल पहले संदर्भित कार्य करता है। दूसरा एक तो की तरह एक "बुरा फ़ाइल वर्णनकर्ता" त्रुटि दिखाता है:बैश डबल प्रोसेस प्रतिस्थापन खराब फ़ाइल डिस्क्रिप्टर

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

ऐसा लगता है कि दूसरा पाइप एक बार गिरा एक संदर्भित है जाता है, लेकिन एक) मैं और किसी भी दस्तावेज में इस व्यवहार की पुष्टि नहीं कर पा रहे ख) मेरी इच्छा है कि यह नहीं होगा। =)

मैं क्या गलत कर रहा हूं पर कोई विचार? एफडब्ल्यूआईडब्ल्यू मैं कमांड लाइन के बजाय मैक ओएस एक्स के फाइलमेज ग्राफिकल डिफ टूल का उपयोग करने के लिए एक रैपर बनाने के लिए ऐसा कर रहा हूं, जो कमांड लाइन से कई पाइपों के साथ काम करने से पहले ही खुश है।

-Rob

उत्तर

2

क्या आप वाकई बैश के साथ और नहीं कुछ अन्य खोल यह चल रहे हैं? क्या आपने echo $SHELL के आउटपुट की जांच की है? मुझे बैश प्रयोग करने के लिए

वर्क्स ठीक:

[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/पानी का छींटा उदाहरण के लिए मैं त्रुटियों मिलता है।

कृपया अपनी स्क्रिप्ट की पहली पंक्ति पर शेबैंग के रूप में #!/Bin/bash डालने का प्रयास करें।

+0

एक जवाब नहीं है यही कारण है कि ... मैंने अभी जांच की है - यह लिनक्स पर काम करता है और ओएसएक्स पर विफल रहता है, जो ओपी का मंच लगता है। –

4

ओएसएक्स (3.2.48) के साथ आपूर्ति /bin/bash उस पर विफल रहता है। मैकपोर्ट्स में से एक (4.2.37 - सामान्यतः /opt/local/bin/bash यदि आपने इसे इंस्टॉल किया है) ठीक काम करता है। चाहे वह संस्करण या निर्माण हो, मुझे नहीं पता। शायद आप इस स्क्रिप्ट के लिए मैकपोर्ट्स बैश का उपयोग करना चाह सकते हैं। एक निश्चित रूप से प्रत्येक मैक पर मैकपोर्ट होना पड़ता है, इसलिए मुझे लगता है कि आप करते हैं ;-)

+0

हाँ, मैकपोर्ट्स बैश ने इसे मेरे लिए तय किया। मैं अपना टर्मिनल लॉगिन अपडेट करूंगा। धन्यवाद! – rharder

5

सबसे पहले, मुझे लगता है कि @Michael Krelin ओएस एक्स (v3.2.48) के साथ प्रदान किए गए बश के संस्करण से संबंधित होने के बारे में सही है। यह मेरा परीक्षण से लगता है जैसे कि फ़ाइल वर्णनकर्ता पहला बाहरी आदेश के बाद निकाल दिए जाते फ़ंक्शन निष्पादित:

$ 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

भयानक कामकाज। हां, क्षमा करें, निर्दिष्ट नहीं है, लेकिन अजीब व्यवहार ओएस एक्स 10.8 पर था। मुझे लगता है कि यह विचित्र व्यवहार भी सिगविन में नहीं हुआ था। अगर मैं "सही" काम कर रहा हूं तो मैं शायद मैकपोर्ट बैश पर स्विच करूंगा। वर्कअराउंड के लिए – rharder

+0

+1। पूरी तरह से अव्यवहारिक, लेकिन ठंडा ;-) –