2009-03-05 14 views
208

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

मैं विंडोज़ "इको ऑफ" जैसी कुछ ढूंढ रहा हूं।

उत्तर

366

निम्नलिखित नल डिवाइस (बिट बाल्टी) में मानक आउटपुट भेजता है।

और आप भी त्रुटि संदेश वहाँ भेजे जाने के लिए, की (पहले सभी के गोले में काम नहीं कर सकते हैं) एक का उपयोग करें चाहते हैं:

scriptname &>/dev/null 
scriptname >/dev/null 2>&1 
scriptname >/dev/null 2>/dev/null 

और, यदि आप संदेशों रिकॉर्ड करना चाहते हैं, लेकिन नहीं, उन्हें देखने के रूप में एक वास्तविक फ़ाइल के साथ /dev/null की जगह,:

scriptname &>scriptname.out 

पूर्णता के लिए विंडोज cmd.exe (जहां "नुल" "/ dev/बातिल" के बराबर है) के तहत, यह है:

scriptname >nul 2>nul 
+8

नोट कि '&>' बाश के लिए अनोखा है (और शायद सी गोले); कॉर्न और बॉर्न शैल को 2>/dev/null या 2> और 1 (stdout के समान स्थान पर stderr भेजने के लिए) की आवश्यकता होती है। कॉर्न शैल '&>' की व्याख्या करता है जैसे "सामान तक और पृष्ठभूमि में चलाएं, फिर रिक्त कमांड पर i/O पुनर्निर्देशन करें"। –

+2

ध्यान दें कि कुछ आदेश मानक आउटपुट/त्रुटि के बजाय टर्मिनल डिवाइस पर सीधे लिखते हैं। परीक्षण करने के लिए, स्क्रिप्ट में 'echo foo> $ (tty)' डालें और './test.sh &>/dev/null' चलाएं - आउटपुट अभी भी टर्मिनल पर मुद्रित है। बेशक यह कोई समस्या नहीं है यदि आप एक ऐसी स्क्रिप्ट लिख रहे हैं जो ऐसे आदेशों का उपयोग नहीं करती है। – l0b0

+1

बढ़िया! > नूल 2> विंडोज़ के तहत सिगविन के लिए नूल काम करता है! – yang

30

कुछ की तरह

script > /dev/null 2>&1 

यह मानक उत्पादन और त्रुटि उत्पादन रोक दिया जाएगा, उन दोनों को /dev/null के लिए पुनः निर्देशित।

+3

अगर आप कुछ टाइपिंग को सहेजना चाहते हैं तो बस और> के साथ भी हासिल किया गया है;) – andynormancx

+1

भले ही मैं इसे अपने जीएस (घोस्टस्क्रिप्ट) कमांड में जोड़ रहा हूं, फिर भी यह प्रिंट करता है **** चेतावनी: फ़ाइल में दूषित %% EOF मार्कर है , या %% ईओएफ के बाद कचरा। कोई सलाह? – Piero

4

andynormancx पोस्ट इस का उपयोग की तरह: (यदि आप एक यूनिक्स वातावरण में काम कर रहे हैं)

scriptname > /dev/null 

या आप इस का उपयोग कर सकते हैं: (यदि आप एक Windows वातावरण में काम कर रहे हैं)

scriptname > nul 
+1

आप वास्तव में विंडोज शैल में उससे बेहतर कर सकते हैं। यदि इसके बजाय आप "scriptname> nul" का उपयोग करते हैं तो आपके पास हटाने के लिए एक फ़ाइल भी नहीं होगी, क्योंकि "नूल" विंडोज़ समकक्ष/dev/null है। – andynormancx

+1

@andynormancx: यही वह है जो मुझे विंडोज फाइल सिस्टम लेआउट के बारे में नफरत है। यह एनयूएल, कॉम 1, एलपीटी 1, कॉन इत्यादि जैसे "रिजर्व" फ़ाइल नामों से कोई फर्क नहीं पड़ता कि आप किस निर्देशिका में हैं (भले ही आप फ़ाइल-सिस्टम में हों, जिसमें नेटवर्क शेयरों की तरह फाइलें हो सकती हैं)। – dreamlax

+0

मुझे नहीं लगता कि मैंने वास्तव में डीओएस 5.x के बाद एनयूएल का उपयोग किया है, जब मैंने यह जवाब देखा तो स्मरण का अचानक फ्लैश था;) – andynormancx

7

प्रयास करें

: $(yourcommand) 

: "कुछ भी नहीं" का संक्षिप्त रूप है।

$() बस आपका आदेश है।

$ DUMMY=`grep root /etc/passwd` 
$ echo $? 
0 
$ DUMMY=`grep r00t /etc/passwd` 
$ echo $? 
1 

के बाद से बैश और अन्य POSIX कमांडलाइन दुभाषिए एक कमांड के रूप में चर असाइनमेंट पर विचार नहीं करता, वर्तमान आदेश के:

+1

बहुत रोचक है लेकिन एक सीमा है: लौटा हुआ स्थिति कोड हमेशा '0' है (सफलता)। आइए कमांड 'झूठी' का प्रयोग करके एक उदाहरण देखें जो हमेशा '1' (विफलता) देता है। उदाहरण के लिए '(echo foo | tee फ़ाइल; false) && echo bar' प्रदर्शित करता है' foo'। आउटपुट को दबाने के लिए अपनी चाल का उपयोग करना: '(: $ (echo foo | tee फ़ाइल; false)) && echo bar'। लेकिन यह 'बार' प्रदर्शित करता है जिसका अर्थ है कि वापसी स्थिति कोड '0' है (यह 'झूठी' से लौटाया गया स्थिति कोड नहीं है)। कृपया इस सीमा को प्रदान करने के अपने उत्तर को अपडेट करें। चीयर्स – olibre

+2

@olibre, 'DUMMY = $ (yourcommand) 'के बारे में क्या? आपके पास उल्लेख की गई सीमा नहीं है। :) – semente

+3

@semente परफेक्ट: कमांड 'DUMMY = $ (echo foo | tee file; false) && echo bar' कुछ भी प्रदर्शित नहीं करता है।और आदेश 'DUMMY = $ (echo foo | tee file; true) && echo bar' प्रदर्शित करता है' bar'। अगर आप इसे ऊपर उठाने का उत्तर देते हैं तो मुझे बताएं ;-) चीयर्स – olibre

4

एक वैकल्पिक कि कुछ स्थितियों में फिट हो सकता एक चर के लिए एक आदेश का परिणाम आवंटित करने के लिए है वापसी कोड का सम्मान किया जाता है।

1

बैश स्क्रिप्टिंग के साथ, मैं कमांड से सभी आउटपुट को कैसे दबा सकता हूं?


IMHO, मुझे विश्वास है कि आप के रूप में पहले उत्तर में मनाया, इस पुनर्निर्देशन का उपयोग कर सरल प्राप्त कर सकते हैं, और कुछ नहीं:

/path/to/command &>/dev/null 


The Linux Documentation Project से यह उदाहरण है उल्लेख करने के लायक भी:

3.6 नमूना: stderr और stdout 2 फ़ाइल

यह किसी प्रोग्राम के प्रत्येक आउटपुट को फ़ाइल में रखेगा। यह कभी-कभी क्रॉन प्रविष्टियों के लिए उपयुक्त है, यदि आप पूर्ण चुप्पी में पास करने के लिए एक आदेश चाहते हैं।

 rm -f $(find/-name core) &> /dev/null 
1

आप स्क्रिप्ट में आप लाइनों आप जानते हैं कि एक आउटपुट देने जा रहे हैं के लिए निम्न जोड़ सकते हैं:

some_code 2>>/dev/null 

वरना तुम भी कोशिश कर सकते हैं

some_code >>/dev/null 
संबंधित मुद्दे

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