किसी भी कमांड के आउटपुट को रीडायरेक्ट कैसे करें?


14

मैं अपने नेटवर्क की स्थिति की निगरानी के लिए एक साधारण स्क्रिप्ट लिखने की कोशिश कर रहा हूँ, बिना pingआउटपुट के:

ping -q -c 1 google.com > /dev/null && echo online || echo offline

समस्या यह है कि जब मैं जुड़ा नहीं हूँ, तब भी मुझे अपने आउटपुट में एक त्रुटि संदेश मिल रहा है:

ping: unknown host google.com
offline

मैं अपने आउटपुट से इस त्रुटि संदेश को कैसे रख सकता हूं?

जवाबों:


28

जब आप दौड़ते हैं:

ping -q -c 1 google.com > /dev/null && echo online || echo offline

आप अनिवार्य रूप से केवल स्ट्रीम 1 (यानी stdout) के आउटपुट को रीडायरेक्ट कर रहे हैं /dev/null

जब आप किसी प्रोग्राम के सामान्य निष्पादन द्वारा उत्पादित आउटपुट को पुनर्निर्देशित करना चाहते हैं तो यह ठीक है। हालाँकि, यदि आप सभी त्रुटियों, चेतावनियों या विफलताओं के कारण होने वाले आउटपुट को पुनर्निर्देशित करना चाहते हैं, तो आपको stderrया मानक त्रुटि स्ट्रीम को भी पुनर्निर्देशित करना चाहिए /dev/null

इसे करने का एक तरीका यह है कि आप पुनर्निर्देशन ऑपरेटर को पुनर्निर्देशित करने की इच्छा की धारा की संख्या को इस तरह से प्रस्तुत कर रहे हैं >:Command 2> /dev/null

इसलिए, आपका आदेश ऐसा दिखेगा:

ping -q -c 1 google.com > /dev/null 2> /dev/null && echo online || echo offline

लेकिन, ध्यान दें कि हम पहले ही एक स्ट्रीम को पुनर्निर्देशित कर चुके हैं /dev/null। क्यों नहीं बस उसी पुनर्निर्देशन पर सूअर का बच्चा? बैश हमें स्ट्रीम नंबर को निर्दिष्ट करने के लिए ऐसा करने की अनुमति देता है जिससे कि पुनर्निर्देशित किया जा सके। 2>&1

&पुनर्निर्देशन ऑपरेटर के बाद चरित्र को नोटिस करें । यह शेल को बताता है कि आगे जो दिखाई देता है वह फ़ाइल नाम नहीं है, बल्कि आउटपुट स्ट्रीम के लिए एक पहचानकर्ता है।

ping -q -c 1 google.com > /dev/null 2>&1  echo online || echo offline

पुनर्निर्देशन ऑपरेटरों के साथ सावधान रहें, उनका आदेश बहुत मायने रखता है। यदि आप गलत क्रम में अनुप्रेषित करना चाहते थे, तो आप अप्रत्याशित परिणामों के साथ समाप्त होंगे।

एक और तरीका जिसमें आप पूरी तरह से मौन प्राप्त कर सकते हैं, इस शॉर्टकट का उपयोग करने के लिए सभी आउटपुट स्ट्रीम को पुनर्निर्देशित कर रहा है /dev/null: &>/dev/null(या लॉग फ़ाइल के साथ रीडायरेक्ट &>/path/to/file.log)।

इसलिए, अपनी कमांड इस प्रकार लिखें:

ping -q -c 1 google.com &> /dev/null && echo online || echo offline

1
अहा &>/dev/nullयह है। तात्कालिक मदद के लिए आप सभी का धन्यवाद!
ओपेराला २ oper'१४ को १

4
Be careful with the redirection operators, their order matters a lot., लेकिन आपने वास्तव में उपयोग करने का एक उदाहरण शामिल नहीं किया है2>&1
इज़्काटा

मैं जोड़ना भूल गया था! उदाहरण को प्रतिबिंबित करने के लिए संपादित उत्तर। जब मेरे हाथों पर थोड़ा और समय होगा, तो मैं बताऊंगा कि ऑर्डर कैसे काम करता है।
दानीर

9

आपको मानक आउटपुट ( >या 1>) और मानक त्रुटि ( 2>) दोनों को पुनर्निर्देशित करने की आवश्यकता है :

ping -q -c 1 google.com > /dev/null 2>/dev/null && echo online || echo offline

या, एक को दूसरे पर पुनर्निर्देशित करें:

ping -q -c 1 google.com > /dev/null 2>&1 && echo online || echo offline

8
$ ping -q -c 1 google.com > /dev/null 2>&1 && echo online || echo offline

उदाहरण

$ ping -q -c 1 google.com > /dev/null 2>&1 && echo online || echo offline
online

$ ping -q -c 1 googleadf.com > /dev/null 2>&1 && echo online || echo offline
offline

पिंग को तेज करना

आपके pingकार्यान्वयन के आधार पर आप एक ही गिनती तक सीमित हो सकते हैं -c 1। कुछ कार्यान्वयन आपको इससे नीचे जाने देंगे, लेकिन आपको अनिवार्य रूप से खराब लुकअप के समय समाप्त होने का इंतजार करना होगा। इसलिए उपयोग करने के बजाय pingआप fingइसके बजाय उपयोग करना चाह सकते हैं ।

पिंग असफलता की सुस्ती

$ date; ping -q -c 1 google.com > /dev/null 2>&1 && echo online || echo offline; date
Tue Jan 28 13:51:10 EST 2014
online
Tue Jan 28 13:51:10 EST 2014

$ date; ping -q -c 1 googleadf.com > /dev/null 2>&1 && echo online || echo offline; date
Tue Jan 28 13:51:15 EST 2014
offline
Tue Jan 28 13:51:25 EST 2014

अंगुलियों का फटना बहुत तेज होता है

$ date; fing -p google.com > /dev/null 2>&1 && echo online || echo offline; date
Tue Jan 28 13:49:21 EST 2014
online
Tue Jan 28 13:49:22 EST 2014

$ date; fing -p googleadf.com > /dev/null 2>&1 && echo online || echo offline; date
Tue Jan 28 13:49:35 EST 2014
online
Tue Jan 28 13:49:38 EST 2014

1
मैं इसके बजाय timeमैन्युअल रूप से समय के अंतर की गणना करने की तुलना में कमांड का उपयोग करता हूं date:time { fing -p googleadf.com > /dev/null 2>&1 && echo online || echo offline; }
रुस्लान

@Ruslan - धन्यवाद, मैंने इसे इस तरह किया b / c मुझे आउटपुट चाहिए था date। किसी अन्य व्यक्ति द्वारा उत्पन्न आउटपुट को पढ़ना आसान है, IMO।
SLM
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.