मैं चाहता हूं कि जब भी उनके साथ निष्पादित कोई कमांड विफल हो जाए तो मैं अपनी शेल स्क्रिप्ट को विफल कर दूं।
आमतौर पर मैं ऐसा करता हूं:
set -e
set -o pipefail
(आमतौर पर मैं set -u
भी जोड़ता हूं )
बात यह है कि उपरोक्त कोई भी प्रक्रिया प्रतिस्थापन के साथ काम नहीं करता है। यह कोड "ओके" प्रिंट करता है और रिटर्न कोड = 0 से बाहर निकलता है, जबकि मैं चाहूंगा कि यह विफल हो:
#!/bin/bash -e
set -o pipefail
cat <(false) <(echo ok)
क्या "पाइपफेल" के बराबर कुछ भी है लेकिन प्रक्रिया प्रतिस्थापन के लिए? किसी कमांड को कमांड के आउटपुट को पास करने का कोई अन्य तरीका जैसा कि वे फाइल थे, लेकिन जब भी उन प्रोग्रामों में से कोई भी विफल हो जाता है तो एक त्रुटि बढ़ जाती है?
एक गरीब आदमी के समाधान का पता लगाने अगर उन आदेशों stderr करने के लिए (लेकिन कुछ आदेश sucessful परिदृश्यों में stderr करने के लिए लिखते हैं) का पता लगाने जाएगा।
नामांकित पाइपों का उपयोग करने वाला एक और पॉज़िक्स अनुपालन समाधान होगा, लेकिन मुझे उन आदेशों का उपयोग करने की आवश्यकता है, जो कि उपयोग-प्रक्रिया-प्रतिस्थापन का उपयोग करते हैं क्योंकि संकलित कोड से मक्खी पर बनाया गया ऑनलाइनर, और नामित पाइप बनाने से चीजें जटिल हो जाएंगी (अतिरिक्त कमांड, के लिए त्रुटि फंसाना) उन्हें हटाना, आदि)
$$
प्रतिस्थापन मेरे लिए काम नहीं करता है, क्योंकि ths कमांड प्रतिस्थापन को कमांड के रूप में नहीं किया जाता है जो प्रक्रिया प्रतिस्थापन का उपयोग करता है एक कमांड पाइपलाइन के अंदर किया जाता है जो कि "नॉन शेल" कोड (पायथन) से उत्पन्न होता है। संभवतः मुझे अजगर में उपप्रकार बनाना चाहिए और उन्हें प्रोग्रामेटिक रूप से पाइप करना चाहिए।
kill -2 0
।
mkfifo pipe; { rm pipe; cat <file; } >pipe
। वह कमांड तब तक लटकेगा जब तक कि एक पाठक नहीं खुल जाता हैpipe
क्योंकि यह वह शेल है जो करता हैopen()
और इसलिए जैसे हीpipe
fs लिंक पर एक रीडर होताpipe
हैrm
'd है और फिरcat
उस पाइप के लिए शेल के डिस्क्रिप्टर पर infile कॉपी करता है। और वैसे भी, यदि आप एक प्रक्रिया से बाहर एक त्रुटि का प्रचार करना चाहते हैं: <( ! : || kill -2 "$$")