मुझे पता है कि >साइन का उपयोग कमांड लाइन में आउटपुट पुनर्निर्देशन के लिए किया जाता है, लेकिन मुझे ऐसा कुछ ढूंढने में परेशानी हो रही है जो 2>&1कमांड लाइन के उपयोग के बारे में बताता है । उदाहरण के लिए:
curl http://www.google.com > /dev/null 2>&1 &
मुझे पता है कि >साइन का उपयोग कमांड लाइन में आउटपुट पुनर्निर्देशन के लिए किया जाता है, लेकिन मुझे ऐसा कुछ ढूंढने में परेशानी हो रही है जो 2>&1कमांड लाइन के उपयोग के बारे में बताता है । उदाहरण के लिए:
curl http://www.google.com > /dev/null 2>&1 &
जवाबों:
1अर्थ है मानक निर्गम (stdout)। 2अर्थ है मानक त्रुटि (stderr)।
तो 2>&1मानक त्रुटि भेजने के लिए कहता है जहाँ कभी भी मानक आउटपुट को पुनर्निर्देशित किया जा रहा है। जो कि इसे भेजा जा रहा है /dev/nullवह किसी भी आउटपुट को अनदेखा करने के समान है।
0(stdin), 1(stdout) और 2(stderr) वास्तव में फ़ाइल डिस्क्रिप्टर होते हैं, शेल को पुनर्निर्देशन के लिए उनके सामने एक एम्परसेंड की आवश्यकता होती है। यह इस मामले में फ़ाइल डिस्क्रिप्टर को डुप्लिकेट करता है जो प्रभावी रूप से सूचना की दो धाराओं को एक साथ विलय करता है।
curl http://www.google.com 2>/dev/nullकमांड लाइन कैसे जानती है कि यहां "2" का मतलब स्ट्रैडर है और वास्तव में दूसरा पैरामीटर नहीं है जो मैं क्यूरेटर कमांड को दे रहा हूं?
stderrसीधे से सभी आउटपुट भेजेंगे /dev/null। आप कोशिश करके इसे देख सकते हैं curl, curl 1>/dev/nullऔर curl 2>/dev/nullसिर्फ आउटपुट में बदलाव देख सकते हैं। पुन: एम्परसैंड केवल फ़ाइल डिस्क्रिप्टर के लिए पुनर्निर्देशित होने के लिए आवश्यक है।
लायें 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स्क्रीन पर फ़ाइल सामग्री को प्रदर्शित करने के लिए यह जांचने के लिए।
पहला भाग > /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/nullएक खाली फ़ाइल है, एक तंत्र जो इसे लिखा सब कुछ त्यागने के लिए उपयोग किया जाता है। इसलिए,
curl http://www.google.com > /dev/nullप्रभावी ढंग से curlउत्पादन को दबा रहा है ।

लेकिन वहाँ कुछ सामान अभी भी टर्मिनल पर प्रदर्शित क्यों है ?. यह वह जगह है नहीं curl नियमित रूप से उत्पादन के लिए, लेकिन करने के लिए भेजा डेटा stderr, प्रगति और नैदानिक जानकारी और न सिर्फ प्रदर्शित करने के लिए यहां इस्तेमाल किया त्रुटियों ।
curl http://www.google.com > /dev/null 2>&1दोनों curlके आउटपुट और curlप्रगति की जानकारी को अनदेखा करता है । परिणाम कुछ भी नहीं टर्मिनल पर प्रदर्शित किया जाता है।
&अंत में आप कैसे एक के रूप में आदेश को चलाने के लिए खोल को बयां करती हैं काम में पृष्ठभूमि । यह प्रॉम्प्ट तुरंत वापस लौटने का कारण बनता है जबकि कमांड पर्दे के पीछे अतुल्यकालिक रूप से चलाया जाता है। jobsअपने टर्मिनल में वर्तमान नौकरियों के प्रकार को देखने के लिए । ध्यान दें कि यह आपके सिस्टम में चल रही प्रक्रियाओं से अलग है। topटर्मिनल में उन प्रकार को देखने के लिए ।
/dev/null? क्या आप curlकम से कम कहीं उपयोगी के परिणाम नहीं चाहते हैं ?
मेरी समझ में अनुसरण के रूप में:
यदि आप केवल स्क्रीन पर कमांड की आउटपुट और एरर जानकारी पढ़ना चाहते हैं, तो बस लिखें:
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