जब तक गैर-शून्य निकास कोड न हो, उत्पादन को दबाएं


19

जब तक कार्यक्रम गैर-शून्य कोड के साथ बाहर नहीं निकलता तब तक आउटपुट (stdout और stderr) को दबाने का सबसे अच्छा तरीका क्या है? मै सोच रहा हूँ:

quiet_success()
{
  file=$(mktemp)
  if ! "$@" > "$file" 2>&1; then
    cat "$file"
  fi
  rm -f "$file"
}

और चलाओ quiet_success my_long_noisy_script.shलेकिन मुझे यकीन नहीं है कि अगर कोई बेहतर तरीका है। मुझे लगता है कि ऐसा कुछ और लोगों को करना होगा।

संदर्भ के लिए, मैं इसे अपनी क्रोन लिपियों में जोड़ना चाह रहा हूं ताकि मैं विफल होने पर सब कुछ ईमेल कर दूं, लेकिन अगर वे नहीं करते हैं तो नहीं।


यह अधिकांश आदेशों का डिफ़ॉल्ट व्यवहार होना चाहिए (सफलता पर कोई आउटपुट नहीं)। यदि नहीं, तो पहली बात यह है कि इस तरह के व्यवहार को सक्षम करने के लिए एक विकल्प / स्विच की तलाश करें। असफल होना, आपका दृष्टिकोण सही विचार है। साइड नोट: मैं मान रहा हूं कि आपने छद्म कोड पोस्ट किया है क्योंकि यह वास्तव में मान्य shवाक्यविन्यास नहीं है, और आपका पुनर्निर्देशन आदेश पीछे की ओर है ( > "$file" 2>&1अधिक उद्धरणों का उपयोग और उपयोग करें)।
jw013

हां, मैंने इसे प्रश्न में टाइप किया। आपके सुझाव पर अमल किया, और मैं मानता हूं, इसके लिए कमान जिम्मेदार होनी चाहिए , लेकिन अफसोस ...
dimo414

बस एक सिंटैक्स नोट: कमांड के चारों ओर कोष्ठक की कोई आवश्यकता नहीं है।
मैनटवर्क

जवाबों:


14

आप उत्पादन को बफर करने जा रहे हैं, कहीं भी कोई फर्क नहीं पड़ता, क्योंकि आपको यह जानने के लिए कि बाहर निकलने के कोड का इंतजार करना होगा। कुछ इस तरह से शायद सबसे आसान है:

$ output=`my_long_noisy_script.sh 2>&1` || echo $output

ध्यान दें कि यदि आप set -o xtraceअपनी शेल स्क्रिप्ट में उपयोग करते हैं तो सभी आउटपुट फिर से असाइनमेंट output=...:-) के विवरण को लॉग करने के भाग के रूप में होंगे । उस स्थिति में इसका उपयोग करना बेहतर है chronic
जन-फिलिप गेर्के 19

11

moreutilsपैकेज के लिए एक कार्यक्रम में शामिल है chronicइस उद्देश्य के लिए। आप इसे जैसे कहते हैं

chronic my_program args ...

क्रोन नौकरियों में बहुत आसान है।


3
मेरे लिए और गलती के chronicलिए मत बनो cronic, जो एक समान कार्यक्रम है जो आउटपुट को दबाता है जब तक कि कोई कमांड नॉन-जीरो कोड के साथ मौजूद नहीं है या मानक त्रुटि आउटपुट का उत्पादन नहीं करता है
विटिको
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.