कमांड लाइन में "2> और 1" क्या करता है?


59

मुझे पता है कि >साइन का उपयोग कमांड लाइन में आउटपुट पुनर्निर्देशन के लिए किया जाता है, लेकिन मुझे ऐसा कुछ ढूंढने में परेशानी हो रही है जो 2>&1कमांड लाइन के उपयोग के बारे में बताता है । उदाहरण के लिए:

curl http://www.google.com > /dev/null 2>&1 &

जवाबों:


78

1अर्थ है मानक निर्गम (stdout)। 2अर्थ है मानक त्रुटि (stderr)।

तो 2>&1मानक त्रुटि भेजने के लिए कहता है जहाँ कभी भी मानक आउटपुट को पुनर्निर्देशित किया जा रहा है। जो कि इसे भेजा जा रहा है /dev/nullवह किसी भी आउटपुट को अनदेखा करने के समान है।


2
क्या कोई कारण है कि एक एम्परसेंड 1 से पहले दिखाई देता है, लेकिन 2 से पहले नहीं? मुझे लगा कि पृष्ठभूमि में नौकरी चलाने के लिए & एक आरक्षित चरित्र था, लेकिन मुझे लगता है कि अगर कमांड के अंत में एम्परसेंड एक लंबे चरित्र के रूप में दिखाई देता है तो ...?
मैट हगिंस

8
क्योंकि 0(stdin), 1(stdout) और 2(stderr) वास्तव में फ़ाइल डिस्क्रिप्टर होते हैं, शेल को पुनर्निर्देशन के लिए उनके सामने एक एम्परसेंड की आवश्यकता होती है। यह इस मामले में फ़ाइल डिस्क्रिप्टर को डुप्लिकेट करता है जो प्रभावी रूप से सूचना की दो धाराओं को एक साथ विलय करता है।
चीलियन

12
इसे इस तरह से सोचें: यदि आपके पास "1" बिना किसी एम्परसेंड के था, तो शेल "1" नामक एक फ़ाइल बनाएगा और इसके लिए स्टेटर आउटपुट को रीडायरेक्ट करेगा।
कार्लफ नोव

1
ठीक है, क्या यह अकेले वैध होगा? curl http://www.google.com 2>/dev/nullकमांड लाइन कैसे जानती है कि यहां "2" का मतलब स्ट्रैडर है और वास्तव में दूसरा पैरामीटर नहीं है जो मैं क्यूरेटर कमांड को दे रहा हूं?
मैट हगिंस

1
@ मैट हगिन्स: हाँ। इसके बजाय stderrसीधे से सभी आउटपुट भेजेंगे /dev/null। आप कोशिश करके इसे देख सकते हैं curl, curl 1>/dev/nullऔर curl 2>/dev/nullसिर्फ आउटपुट में बदलाव देख सकते हैं। पुन: एम्परसैंड केवल फ़ाइल डिस्क्रिप्टर के लिए पुनर्निर्देशित होने के लिए आवश्यक है।
चीलियन

23

tl; डॉ

लायें http://www.google.comमें पृष्ठभूमि और त्यागने दोनों stdoutऔर stderr

curl http://www.google.com > /dev/null 2>&1 &

के समान है

curl http://www.google.com > /dev/null 2>/dev/null &

मूल बातें

0, 1और POSIX ऑपरेटिंग सिस्टम में 2मानक फ़ाइल डिस्क्रिप्टर का प्रतिनिधित्व करते हैं। एक फाइल डिस्क्रिप्टर एक फाइल या सॉकेट के लिए (मूल रूप से) एक सिस्टम रेफरेंस है ।

C में एक नया फ़ाइल डिस्क्रिप्टर बनाना कुछ इस तरह दिख सकता है:

fd = open("data.dat", O_RDONLY)

अधिकांश यूनिक्स सिस्टम कमांड कुछ इनपुट लेते हैं और परिणाम को टर्मिनल तक पहुंचाते हैं। curlनिर्दिष्ट url ( google dot com ) पर जो भी होगा उसे लाएँगे और परिणाम को प्रदर्शित करेंगे stdout

कर्ल परिणाम

पुनर्निर्देशन

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

उदाहरण के लिए, में ls > myfiles.txt, lsवर्तमान निर्देशिका की सामग्री प्राप्त करता है और >इसके आउटपुट को रीडायरेक्ट करता है myfiles.txt(यदि फ़ाइल मौजूद नहीं है, तो इसे ओवरराइट किया गया है, लेकिन आप >>इसके बजाय >फ़ाइल में संलग्न करने के बजाय उपयोग कर सकते हैं )। यदि आप ऊपर कमांड चलाते हैं, तो आप देखेंगे कि टर्मिनल में कुछ भी प्रदर्शित नहीं होता है। यह आमतौर पर यूनिक्स सिस्टम में सफलता का मतलब है। cat myfiles.txtस्क्रीन पर फ़ाइल सामग्री को प्रदर्शित करने के लिए यह जांचने के लिए।

> / देव / अशक्त 2> & 1

पहला भाग > /dev/nullपुनर्निर्देशित करता है stdout, जो कि (इसके आगे) पर curlआउटपुट है /dev/nullऔर इसे 2>&1रीडायरेक्ट करता stderrहै stdout(जिसे अभी-अभी पुनर्निर्देशित किया गया था /dev/nullताकि सब कुछ भेज दिया जाएगा /dev/null)।

बाईं ओर 2>&1आपको बताता है कि क्या पुनर्निर्देशित किया जाएगा, और दाईं ओर आपको बताता है कि कहां है। &भेद करने के लिए सही पक्ष पर प्रयोग किया जाता है stdout (1)या stderr (2)नामित फ़ाइलों से 1या 2। तो, 2>1एक नई फ़ाइल बनाने का अंत होगा (यदि यह पहले से मौजूद नहीं है) नाम दिया गया है 1और stderrवहां परिणाम को डंप करता है ।

/ Dev / बातिल

/dev/nullएक खाली फ़ाइल है, एक तंत्र जो इसे लिखा सब कुछ त्यागने के लिए उपयोग किया जाता है। इसलिए, curl http://www.google.com > /dev/nullप्रभावी ढंग से curlउत्पादन को दबा रहा है ।

> / देव / अशक्त

लेकिन वहाँ कुछ सामान अभी भी टर्मिनल पर प्रदर्शित क्यों है ?. यह वह जगह है नहीं curl नियमित रूप से उत्पादन के लिए, लेकिन करने के लिए भेजा डेटा stderr, प्रगति और नैदानिक जानकारी और न सिर्फ प्रदर्शित करने के लिए यहां इस्तेमाल किया त्रुटियों

curl http://www.google.com > /dev/null 2>&1दोनों curlके आउटपुट और curlप्रगति की जानकारी को अनदेखा करता है । परिणाम कुछ भी नहीं टर्मिनल पर प्रदर्शित किया जाता है।

आखिरकार

&अंत में आप कैसे एक के रूप में आदेश को चलाने के लिए खोल को बयां करती हैं काम में पृष्ठभूमि । यह प्रॉम्प्ट तुरंत वापस लौटने का कारण बनता है जबकि कमांड पर्दे के पीछे अतुल्यकालिक रूप से चलाया जाता है। jobsअपने टर्मिनल में वर्तमान नौकरियों के प्रकार को देखने के लिए । ध्यान दें कि यह आपके सिस्टम में चल रही प्रक्रियाओं से अलग है। topटर्मिनल में उन प्रकार को देखने के लिए ।

संदर्भ


1
यह एक लेआउट परिप्रेक्ष्य से पूरी वेबसाइट पर सबसे अच्छे उत्तरों में से एक है, अच्छी तरह से किया गया!
ओमरऑथमैन

एक चीज जो मुझे नहीं मिल रही है, वह यह है कि आप सब कुछ क्यों भेजना चाहेंगे /dev/null? क्या आप curlकम से कम कहीं उपयोगी के परिणाम नहीं चाहते हैं ?
skube

@skube राइट। इस मामले में यह मेरे लिए स्पष्ट नहीं है कि उपयोगकर्ता स्टडआउट और स्टॉडर दोनों को क्यों छोड़ना चाहता है। ओपी शायद समझना चाहता था कि वाक्यविन्यास का क्या मतलब है।
जॉर्ज बुकरान

5

2STDERR को संदर्भित करता है। 2>&1STDERR को उसी स्थान 1(STDOUT) पर भेजेगा ।


0

मेरी समझ में अनुसरण के रूप में:

यदि आप केवल स्क्रीन पर कमांड की आउटपुट और एरर जानकारी पढ़ना चाहते हैं, तो बस लिखें: curl http://www.google.com

और कुछ बार जब आप बाद की समीक्षा के लिए टर्मिनल स्क्रीन के बजाय आउटपुट जानकारी को फ़ाइल में सहेजना चाहते हैं, तो आप लिख सकते हैं: curl http://www.google.com > logfile

लेकिन इस तरह से, StdErr जानकारी को छोड़ दिया जाएगा, क्योंकि >केवल StdOut को रीडायरेक्ट किया जाएगा logfile

इसलिए यदि आप कमांड की त्रुटि जानकारी के बारे में परवाह करते हैं एक बार इसे निष्पादित करने में विफल हो जाते हैं, तो आपको StdEr को StdErr के साथ संयोजित करने की आवश्यकता है 2>&1(जिसका अर्थ है StdErr को StdOut में बदल दें), इसलिए निम्न कमांड लाइन को लिखा जा सकता है: curl http://www.google.com > logfile2> और 1

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