बैश स्क्रिप्ट में आउटपुट को कैसे चुप करें?


149

मेरे पास एक प्रोग्राम है जो स्टैडआउट को आउटपुट करता है और एक फ़ाइल को पाइप करते समय एक बैश स्क्रिप्ट में उस आउटपुट को चुप करना चाहता है।

उदाहरण के लिए, प्रोग्राम चलाना आउटपुट देगा:

% myprogram
% WELCOME TO MY PROGRAM
% Done.

मैं चाहता हूँ कि निम्नलिखित स्क्रिप्ट टर्मिनल पर कुछ भी आउटपुट न करे:

#!/bin/bash
myprogram > sample.s

मुझे जो याद आता है, फ़ाइल में आउटपुट को रीडायरेक्ट करने के कारण उसे टर्मिनल पर प्रतिध्वनित नहीं किया जा सकता है। आपके लिए क्या काम नहीं कर रहा है?
आनन।


जवाबों:


187

अगर यह stderr को आउटपुट करता है तो आप इसे चुप कराना चाहते हैं। आप फ़ाइल डिस्क्रिप्टर 2 को पुनर्निर्देशित करके ऐसा कर सकते हैं:

# Send stdout to out.log, stderr to err.log
myprogram > out.log 2> err.log

# Send both stdout and stderr to out.log
myprogram &> out.log      # New bash syntax
myprogram > out.log 2>&1  # Older sh syntax

# Log output, hide errors.
myprogram > out.log 2> /dev/null

15
"&>" लाइन एक छोटा संस्करण है जो मैंने अभी पोस्ट किया है। मैं पहले उस शॉर्टकट में नहीं आया हूं। Upvoting।
चडक्लिफ

5
&>बैश 4 की तुलना में बहुत पुराना है।
इग्नासियो वाज़केज़-अब्राम्स

@ IgnacioVazquez-Abrams क्या आप संभवत: चेंजलॉग दस्तावेज़ीकरण के &>परिचय को जोड़ सकते हैं ? : ओ
थोरसुमोनर

1
git.savannah.gnu.org/cgit/bash.git/tree/CHANGES#n2208 इंगित करता है कि >>&4.0 में पेश किया गया था। इसका कोई उल्लेख नहीं है, &>लेकिन CHANGES केवल 2.0 पर वापस जाता है, इसलिए मुझे लगता है कि इसका मतलब है कि यह पहले से ही 1.x में था।
ट्रिपल

git blameredir.cवर्तमान कोड बेस में सबसे पुरानी घटना के लिए 1998 की प्रतिबद्धता के बिंदुओं पर ।
ट्रिपल जू 30:16

60

Stdout को पुनर्निर्देशित करें

यह stderr (जिसे डिस्क्रिप्टर 2 है) को फाइल डिस्क्रिप्टर 1 पर रीडायरेक्ट करेगा जो कि स्टडआउट है।

2>&1

फ़ाइल पर रीडायरेक्ट करें

अब जब यह प्रदर्शन करते हैं तो आप फ़ाइल के लिए स्टडआउट पुनर्निर्देशित कर रहे हैं sample.s

myprogram > sample.s

फ़ाइल के लिए Stderr और stdout पुनर्निर्देशित करें

दो आदेशों के संयोजन से दोनों stderr और stdout को नमूने में पुनः निर्देशित किया जाएगा

myprogram > sample.s 2>&1

पुनर्निर्देशित stderr और stdout को / dev / null

/dev/nullयदि आप अपने आवेदन को पूरी तरह से चुप कराना चाहते हैं तो पुनर्निर्देशित करें।

myprogram >/dev/null 2>&1

13
पिछले एक पुनर्निर्देशन ऑपरेटर याद आ रही है; यह myprogram >/dev/null 2>&1( /dev/nullपुनर्निर्देशन से पहले वेज नोटिस और) होना चाहिए ।
ट्रिपल

2
myprogram &>/dev/nullपर्याप्त नहीं होगा?
JaviOverflow

38

सभी आउटपुट:

scriptname &>/dev/null

पोर्टेबल:

scriptname >/dev/null 2>&1

पोर्टेबल:

scriptname >/dev/null 2>/dev/null

नए बैश के लिए (कोई पोर्टेबल नहीं):

scriptname &>-

यह काम नहीं करता है। यह वास्तव में नाम से एक फ़ाइल बनाता है -और &>एक गैर-पोर्टेबल बॉर्न शेल एक्सटेंशन है।
फिल्ट

पोर्टेबल समतुल्य echo moo 1>&-एक त्रुटि पैदा करता है क्योंकि फ़ाइल डिस्क्रिप्टर 1 बंद है:-bash: echo: write error: Bad file descriptor
ट्रिपल

11

यदि आप STDOUT और STDERR दोनों [सब कुछ] चाहते हैं, तो सबसे सरल तरीका है:

#!/bin/bash
myprogram >& sample.s

फिर इसे चलाएं ./script, और आपको अपने टर्मिनल पर कोई आउटपुट नहीं मिलेगा। :)

"> और" का अर्थ है STDERR और STDOUT। यह &भी एक पाइप के साथ उसी तरह काम करता है: ./script |& sed जो सब कुछ sed को भेज देगा


7
मैन बैश ("रीडायरेक्टिंग स्टैंडर्ड आउटपुट और स्टैंडर्ड एरर के तहत") कहते हैं और> और> समतुल्य हैं लेकिन पहला (&>) पसंद किया जाता है। हालाँकि: & पाइप्स के लिए ऐसा करने का एकमात्र तरीका है।
जॉन मेलोर

1
@ जॉन नहीं, पाइप के लिए पोर्टेबल तरीका हैa 2>&1 | b 2>&1 | c
ट्रिपल

9

यदि आप अभी भी उत्तर खोजने के लिए संघर्ष कर रहे हैं, विशेष रूप से यदि आपने आउटपुट के लिए एक फ़ाइल का उत्पादन किया है, और आप एक स्पष्ट विकल्प पसंद करते हैं: echo "hi" | grep "use this hack to hide the oputut :) "


2
दिलचस्प हैक ... चतुराई के लिए
upvoting

4

इसके साथ प्रयास करें:

myprogram &>/dev/null

कोई उत्पादन प्राप्त करने के लिए


0

नोट: यह उत्तर इस सवाल से संबंधित है कि "शेल स्क्रिप्ट लिनक्स निष्पादित करते समय इको को कैसे बंद करें" जो कि इस एक के रूप में दोहराया गया था।

वास्तव में प्रतिध्वनि को बंद करने के लिए कमांड है:

स्टिच -चो

(यह उदाहरण के लिए है; जब आप पासवर्ड दर्ज करना चाहते हैं और आप इसे पढ़ने योग्य नहीं बनाना चाहते हैं। अपनी स्क्रिप्ट के अंत में इको चालू करना याद रखें, अन्यथा आपकी स्क्रिप्ट चलाने वाला व्यक्ति वह नहीं देखेगा जो वह नहीं जानता है / वह तब से टाइप करती है। रन पर ईको टर्न करने के लिए:

तेज गूँज


0

लिपियों में उपयोगी:


एक फ़ाइल में केवल STDERR प्राप्त करें, किसी भी STDOUT को छिपाते हुए, भले ही छिपाने का कार्यक्रम बिल्कुल भी मौजूद नहीं है (कभी भी पैरेंट स्क्रिप्ट को लटका नहीं है), यह अकेले काम कर रहा था:

stty -echo && ./programMightNotExist 2> errors.log && stty echo

पूरी तरह से अलग करें और सब कुछ चुप कर दें, यहां तक ​​कि माता-पिता की स्क्रिप्ट को मारना गर्भपात नहीं करेगा ./prog:

 ./prog </dev/null >/dev/null 2>&1 &

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.