2010-02-18 12 views
94

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

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

% myprogram 
% WELCOME TO MY PROGRAM 
% Done. 

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

#!/bin/bash 
myprogram > sample.s 
+0

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

+0

http://serverfault.com/questions/41964/how-to-hide-the-output-of-a-shell-application-in-linux –

उत्तर

128

यह रूप में अच्छी तरह 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 
+7

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

+0

यह बैश 4 में नया है। –

+4

'&>' बैश से बहुत पुराना है 4. –

38

2>&1

आप stderr (जो वर्णनकर्ता 2) फ़ाइल वर्णनकर्ता 1 करने के लिए जो stdout है पुनः निर्देशित किया जाएगा

myprogram > sample.s

अब जब यह प्रदर्शन आप फ़ाइल sample.s को stdout रीडायरेक्ट कर रहे हैं

myprogram > sample.s 2>&1

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

myprogram 2>&1 /dev/null

sample.s लिए आप पूरी तरह से चुप करने के लिए अपने आवेदन

+9

अंतिम में एक पुनर्निर्देशन ऑपरेटर गुम है; यह 'myprogram>/dev/null 2> और 1' होना चाहिए (' dev/null' से पहले wedge को नोटिस करें और पुनर्निर्देशन के क्रम)। – tripleee

10

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

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

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

"> &" का मतलब एसटीडीईआरआर और एसटीडीओयूटी है।./script |& sed है कि सब कुछ भेज देंगे

+3

क्या आपका मतलब "&>" नहीं है? –

+1

हम्म .... मैंने बस इसे अपने तरीके और आपके दोनों की कोशिश की। दोनों – Matt

+6

मैन बैश ("मानक आउटपुट और मानक त्रुटि को पुनर्निर्देशित करने" के अंतर्गत काम करते हैं) कहते हैं &> और> समकक्ष हैं लेकिन पहले (&>) को प्राथमिकता दी जाती है। हालांकि | और पाइप के लिए ऐसा करने का एकमात्र तरीका है। –

15

sed करने के लिए सभी उत्पादन:

scriptname &>/dev/null 

पोर्टेबल:

scriptname >/dev/null 2>&1 

पोर्टेबल:

scriptname >/dev/null 2>/dev/null 
& भी एक पाइप के साथ उसी तरह काम करता

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

scriptname &>- 
+0

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

+0

पोर्टेबल समतुल्य 'echo moo 1> & -' त्रुटि उत्पन्न करता है क्योंकि फ़ाइल डिस्क्रिप्टर 1 बंद है: '-bash: echo: लिखने में त्रुटि: खराब फ़ाइल वर्णनकर्ता – tripleee

4

कोशिश के साथ:

myprogram &>/dev/null 

कोई उत्पादन

+2

यह कुछ गोले में काम करता है, लेकिन पोर्टेबल नहीं है। – tripleee

5

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

+0

दिलचस्प हैक ... चतुरता के लिए upvoting^_ ^ – skplunkerin

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