2011-07-29 13 views
104

के बाहर निकलने के कोड को भी सहेजें, मेरे पास एक शेल स्क्रिप्ट है जिसमें मैं एक कमांड (एमवीएन क्लीन इंस्टॉल) लपेटता हूं, आउटपुट को लॉगफाइल पर रीडायरेक्ट करने के लिए।टी को कम करने के लिए कमांड आउटपुट को दबाएं लेकिन कमांड

#!/bin/bash 
... 
mvn clean install [email protected] | tee $logfile 
echo $? # Does not show the return code of mvn clean install 

अब अगर mvn clean install एक त्रुटि के साथ विफल रहता है, मैं अपने आवरण खोल स्क्रिप्ट भी है कि त्रुटि के साथ विफल चाहते हैं। लेकिन चूंकि मैं टी आउट करने के लिए सभी आउटपुट पाइप कर रहा हूं, इसलिए मैं mvn clean install के रिटर्न कोड तक नहीं पहुंच सकता, इसलिए जब मैं $? एक्सेस करता हूं, तो यह हमेशा 0 (टी सफलताओं के बाद) होता है।

मैं दे आदेश एक अलग फाइल करने के लिए त्रुटि आउटपुट लिखने और जांच करते हुए कि बाद में कोशिश की, लेकिन mvn की त्रुटि उत्पादन हमेशा खाली है (जैसे कि यह केवल stdout के लिए लिखते हैं लगता है)।

मैं mvn clean install की वापसी कोड कैसे रक्षा कर सकते हैं, लेकिन अभी भी एक लॉगफ़ाइल को आउटपुट पाइप?

उत्तर

103

आप bash चला रहे हैं के बाद से, आप अपने $PIPESTATUS चर बजाय $? का उपयोग कर सकते हैं:

mvn clean install [email protected] | tee $logfile 
echo ${PIPESTATUS[0]} 
+1

नीचे उल्लेख किया है यदि आप एक ही पाइप से अधिक है तो आपको प्रत्येक की स्थिति की जांच करने की आवश्यकता होगी यह जानने के लिए आदेश कहां विफल हुआ। –

+0

सही काम करता है, धन्यवाद। – plang

+1

मेरा दिन :)) – Omriko

9

आप mvn आदेश चला सकता है और बाहर निकलने कोड कैश ... मैं के लिए "गलत" आदेश का उपयोग करें मेरा उदाहरण

$ { false ; echo $? > /tmp/false.status ; } | tee $logfile 
$ cat /tmp/false.status 
1 

इस तरह आप आगे निर्णय लेने के लिए स्थिति फ़ाइल सामग्री का उपयोग कर सकते हैं।

अब मैं उत्सुक हूं कि इसे पूरा करने के लिए एक और अधिक स्पष्ट तरीका है या नहीं।

+0

बनाया मुझे आशा है कि अंतिम जवाब विशिष्ट शैल नहीं है (यानी: बैश केवल)। – Demosthenex

3

वर्कअराउंड (ध्यान दें: एक perfer @ फ्रेडेरिक के समाधान):

f=`mktemp` 
(mvn clean install [email protected]; echo $?>$f) | tee $logfile 
e=`cat $f` #error in variable e 
rm $f 
+0

क्या हम 'बिल्ली' के बजाय 'read e <$ f' के साथ एक कांटा बचा सकते हैं? – Jens

+0

सुनिश्चित करें। और आप शायद दौड़ की स्थिति से बचने के लिए एक टेम्पफाइल बनाना चाहते हैं। लेकिन, जैसा कि आप देख सकते हैं कि बेहतर समाधान हैं ... –

130

आप व्यवहार आप चाहते हैं पाने के लिए पर pipefailshell option विकल्प सेट कर सकते हैं।

Bash Reference Manual से:

एक पाइप लाइन के निकास की स्थिति, जब तक pipefail विकल्प सक्षम है (The Set Builtin देखें) पाइप लाइन में पिछले आदेश के निकास स्थिति है। हैं pipefail सक्षम किया गया है, पाइप लाइन की वापसी स्थिति एक गैर शून्य स्थिति, या शून्य अगर सभी आदेशों बाहर निकलने के साथ सफलतापूर्वक बाहर निकलने के लिए पिछले (दायीं) आदेश की मूल्य है।

उदाहरण:

$ false | tee /dev/null ; echo $? 
0 
$ set -o pipefail 
$ false | tee /dev/null ; echo $? 
1 

मूल पाइप सेटिंग पुनर्स्थापित करने के लिए:

$ set +o pipefail 
+19

यह स्वीकार किए गए समाधान – Stefaan

+1

से सहमत एक अधिक सुरुचिपूर्ण समाधान लगता है। स्वीकार्य उत्तर के लिए आपको पहले से ही पता होना चाहिए कि आपके पाइप में कौन सा आदेश विफल हो जाएगा। यदि आप एक साथ 5 अलग-अलग आदेशों को पाइप कर रहे हैं, तो आपको अनुमान लगाना होगा कि सरणी में कौन सा असफल हो जाएगा। – noahlz

+4

या PIPESTATUS –

संबंधित मुद्दे