मुझे पता है कि >
साइन का उपयोग कमांड लाइन में आउटपुट पुनर्निर्देशन के लिए किया जाता है, लेकिन मुझे ऐसा कुछ ढूंढने में परेशानी हो रही है जो 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 > logfile
2> और 1