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


296

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

मैं विंडोज ' ' इको ऑफ '' जैसी चीज की तलाश में हूं ।

जवाबों:


510

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

scriptname >/dev/null

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

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

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

scriptname &>scriptname.out

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

scriptname >nul 2>nul

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

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

1
@ l0b0, क्या स्क्रिप्ट के (या किसी अन्य प्रोग्राम के) को अलग बनाने का एक तरीका है ताकि सभी आउटपुट को आपके उदाहरण की परवाह किए बिना पुनर्निर्देशित किया जाए? मुझे पता है कि स्क्रीन और स्क्रिप्ट कुछ ऐसा कर सकती है, लेकिन दोनों बारीक हैं और * nix से * nix तक भिन्न हैं।
ब्रेंट

सिआंग /dev/nullमें @yang मौजूद है, आपको उपयोग करने की आवश्यकता नहीं है nul
20o में dimo414

47

कुछ इस तरह

script > /dev/null 2>&1

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


5
यदि आप कुछ टाइपिंग बचाना चाहते हैं, तो बस &> के साथ हासिल की गई;)
-ynormancx

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

यह यूनिक्स सिस्टम पर प्रक्रिया नहीं चलाता है, मुझे करना था2>/dev/null
alper

13

प्रयत्न

: $(yourcommand)

: "कुछ नहीं" के लिए छोटा है।

$() सिर्फ आपकी आज्ञा है।


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

2
@olibre, किस बारे में DUMMY=$(yourcommand)? इसमें आपके द्वारा बताई गई सीमा नहीं है। :)
सेमेन्ते

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

9

एक विकल्प जो कुछ स्थितियों में फिट हो सकता है वह है एक कमांड के परिणाम को एक वैरिएबल में असाइन करना:

$ DUMMY=$( grep root /etc/passwd 2>&1 )
$ echo $?
0
$ DUMMY=$( grep r00t /etc/passwd 2>&1 )
$ echo $?
1

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

ध्यान दें:typeset या declareकीवर्ड के साथ असाइनमेंट को एक कमांड माना जाता है, इसलिए मूल्यांकन किए गए रिटर्न कोड के मामले में असाइनमेंट ही होता है न कि सब-शेल में निष्पादित कमांड:

$ declare DUMMY=$( grep r00t /etc/passwd 2>&1 )
$ echo $?
0

6

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

scriptname > /dev/null

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

scriptname > nul

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

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

मुझे नहीं लगता कि मैंने वास्तव में NOS का उपयोग DOS 5.x के बाद से किया है, जब मुझे यह उत्तर मिला तो याद की अचानक फ्लैश हो गया;)
andynormancx

यदि आपने > nulWindows पर cygwin या git bash के साथ उपयोग किया है और अब आप एक ऐसी nulफ़ाइल से चिपके हुए हैं जिसे हटाया नहीं जा सकता है, तो कृपया इस उत्तर के लिए प्रयास करें , यह एक आकर्षण की तरह काम करती है।
डेमन पेंटर

4

लिनक्स दस्तावेज़ परियोजना से इस उदाहरण पर एक नज़र डालें :

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

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

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

उस ने कहा, आप इस सरल पुनर्निर्देशन का उपयोग कर सकते हैं:

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

1

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

some_code 2>>/dev/null

या फिर आप भी कोशिश कर सकते हैं

some_code >>/dev/null

1
कभी नहीं देखा >> to / dev / null .. जिज्ञासा से बाहर .. आप ऐसा क्यों कर रहे हैं?
फ्लोरियन बर्नडल

क्या यह सभी आउटपुट को दबा रहा है?
पीटर मोर्टेनसेन

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