एक स्क्रिप्ट में "3> और 1 1> & 2 2> & 3" क्या करता है?


69

मैंने इस लाइन को एक स्क्रिप्ट में देखा:

DEVICE=`dialog --inputbox "Festplatten-Laufzeit auslesen. Gebe Sie das 
gewünschte Device an: " 0 70 "" 3>&1 1>&2 2>&3`

क्या है

3>&1 1>&2 2>&3

करते हुए? मुझे पता है कि 1 = stdout और 2 = stderr, लेकिन इसके लिए 3और क्या हैं &?


जवाबों:


77

नंबर फ़ाइल विवरणक हैं और केवल पहले तीन (शून्य से शुरू) का मानकीकृत अर्थ है:

0 - stdin
1 - stdout
2 - stderr

तो आपके कमांड में इनमें से प्रत्येक नंबर एक फाइल डिस्क्रिप्टर का संदर्भ देता है। आप फ़ाइल डिस्क्रिप्टर को किसी फ़ाइल के साथ रीडायरेक्ट कर सकते हैं या >उसे किसी अन्य फ़ाइल डिस्क्रिप्टर के साथ रीडायरेक्ट कर सकते हैं>&

3>&1अपने आदेश पंक्ति में एक नई फ़ाइल वर्णनकर्ता बनाने और इसे पर रीडायरेक्ट करेगा 1जो STDOUT। अब 1>&2फाइल डिस्क्रिप्टर को 1 से रीडायरेक्ट करेगा STDERRऔर 2>&3फाइल डिस्क्रिप्टर 2 से 3 को रीडायरेक्ट करेगा STDOUT

तो मूल रूप से आपने स्विच किया STDOUTऔर STDERR, ये चरण हैं:

  1. एक नया fd 3 बनाएं और इसे fd 1 की ओर इंगित करें
  2. फाइल डिस्क्रिप्टर 1 को फाइल डिस्क्रिप्टर 2 पर पुनर्निर्देशित करें। यदि हम 3 में फाइल डिस्क्रिप्टर को नहीं बचाते तो हम लक्ष्य खो देते।
  3. डिस्क्रिप्टर में फाइल करने के लिए 2 डिस्क्रिप्टर 2 को रीडायरेक्ट करें। अब एक और दो में डिस्क्रिप्टर फाइल करें।

अब यदि प्रोग्राम फ़ाइल डिस्क्रिप्टर 1 में कुछ प्रिंट करता है, तो इसे फाइल डिस्क्रिप्टर 2 में प्रिंट किया जाएगा और इसके विपरीत।


आपने कहा है "आपकी कमांड लाइन में 3> & 1 एक नई फ़ाइल डिस्क्रिप्टर बनाएगा और इसे 1 पर रीडायरेक्ट करेगा जो STREOUT है"। लेकिन क्या 1 का मतलब STDIN नहीं है?
sofs1

19

यह स्वैपिंग है stdoutऔर stderr

>nameफ़ाइल में रीडायरेक्ट आउटपुट का मतलब है name

>&numberडिस्क्रिप्टर फाइल करने के लिए रीडायरेक्ट आउटपुट का मतलब है number

इसलिए &शेल को यह बताने के लिए आवश्यक है कि आपका मतलब फ़ाइल डिस्क्रिप्टर है, न कि फ़ाइल नाम।

एक फाइल डिस्क्रिप्टर एक संख्या है जो पहले से खुली हुई फ़ाइल को संदर्भित करता है। मानक वाले 0मानक इनपुट के लिए हैं, 1मानक आउटपुट के लिए या 2मानक त्रुटि के लिए हैं। आप किसी अन्य नंबर का भी उपयोग कर सकते हैं, जो एक नया फ़ाइल डिस्क्रिप्टर बनाएगा, ठीक उसी तरह जब आप एक नया वेरिएबल बनाते हैं var=value

डिफ़ॉल्ट रूप से, दोनों डिस्क्रिप्टर फाइल करते हैं 1और 2जाते हैं /dev/tty, इसलिए यदि आप somecommand 3>&1 1>&2 2>&3एक नए शेल में चलते हैं , तो यह कुछ भी नहीं बदलता है (अब आपके पास एक फाइल डिस्क्रिप्टर नंबर 3 है)।

लेकिन अगर स्क्रिप्ट में पहले कहीं यह निष्पादन (जैसे exec 2>error.log) का उपयोग करके पुनर्निर्देशन करता है , या स्क्रिप्ट को कमांड लाइन के साथ चलाया जाता है, जिसमें पुनर्निर्देशन (जैसे ./thescript 2>error.log) शामिल है, तो स्वैपिंग स्टैडआउट और स्टेडर कुछ करेगा।

आपके विशिष्ट मामले में, कमांड जो उसके स्टडआउट और स्टैडर स्वैप की गई है dialog। इसके मैन पेज को देखते हुए, मैं देखता हूं

Some widgets, e.g., checklist, will write text to dialog's output.
Normally that is the standard error

इसलिए शायद वह व्यक्ति जिसने स्क्रिप्ट लिखी है वह किसी कारण के बजाय dialogआउटपुट जाना चाहता है ।stdoutstderr

पुनर्निर्देशन का आदेश भी देखें


1

स्क्रिप्ट लेखक ने fd 3 को परिभाषित किया जैसे:

exec 3<> File.txt

"File.txt" खोलें और इसे fd 3 असाइन करें। अधिकतम फ़ाइल विवरण: 255

read -n 4 <&3

केवल 4 वर्ण पढ़ें।

echo -n . >&3

वहां एक दशमलव बिंदु लिखें।

exec 3>&-

बंद fd 3।

cat File.txt

==> 1234.67890


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