बाश में स्टड और स्टडआउट पुनर्निर्देशन की प्राथमिकता


9

मेरा प्रश्न पुनर्निर्देशन पूर्वता के बारे में है जो कि मार है। मान लीजिए कि आपके पास एक कमांड है:

cmd1 < cmd2 > cmd3

क्या यह अनुवाद करेगा:

(cmd1 < cmd2) > cmd3

या

cmd1 < (cmd2 > cmd3)

जवाबों:


11

POSIX मानक निर्दिष्ट करता है कि खोल पुनर्निर्देशन बाएं से दाएं है; यह महत्वपूर्ण है:

निर्माण 2>&1को अक्सर मानक आउटपुट के रूप में एक ही फ़ाइल में मानक त्रुटि को पुनर्निर्देशित करने के लिए उपयोग किया जाता है। चूंकि पुनर्निर्देशन की शुरुआत से अंत तक होता है, पुनर्निर्देशन का क्रम महत्वपूर्ण होता है। उदाहरण के लिए:

ls > foo 2>&1

फ़ाइल करने के लिए मानक आउटपुट और मानक त्रुटि दोनों को निर्देशित करता है foo। तथापि:

ls 2>&1 > foo

केवल मानक आउटपुट को फाइल करने के लिए निर्देश देता है fooक्योंकि मानक आउटपुट को फाइल करने के लिए निर्देशित करने से पहले मानक त्रुटि को मानक आउटपुट के रूप में दोहराया गया था foo

bash मानक के इस भाग के अनुपालन में संचालित होता है:

$ ls doesnotexist > foo 2>&1
$ cat foo
ls: cannot access doesnotexist: No such file or directory
$ ls doesnotexist 2>&1 > foo
ls: cannot access doesnotexist: No such file or directory
$ cat foo
$ 

पाइपिंग के लिए:

क्योंकि मानक इनपुट या मानक आउटपुट का पाइपलाइन असाइनमेंट या दोनों पुनर्निर्देशन से पहले होता है, इसे पुनर्निर्देशन द्वारा संशोधित किया जा सकता है। उदाहरण के लिए:

$ command1 2>&1 | command2

मानक आउटपुट और मानक त्रुटि दोनों command1को मानक इनपुट के लिए भेजता है command2


यह मानता है कि बैश शेल पोसिक्स-कंप्लेंट है।
fpmurphy

1
मुझे नहीं मिल रहा है। चूंकि आपने कहा था कि ऑर्डर बाएं से दाएं की ओर है, ls > foo 2>&1इसका मतलब यह नहीं होना चाहिए कि foo के लिए रीडायरेक्ट स्टडआउट है फिर स्टडआउट के लिए स्ट्रीडर को रीडायरेक्ट करें। तो यह काम नहीं करना चाहिए। इसी तरह दूसरी कमांड को काम करना चाहिए। मुझे यहां क्या समझ नहीं आ रहा है?
दीपक मित्तल

1
@fpmurphy bashआम तौर पर POSIX अनुरूप है, यहां उल्लिखित स्थितियों को छोड़कर , जहां डिफ़ॉल्ट bashव्यवहार भिन्न होता है। bashअधिक अनुरूप बनाने के लिए , आप --posixविकल्प का उपयोग कर सकते हैं ।
मैट एकर्ट

@dpacmittal पहला उदाहरण, ls > foo 2>&1इस तरह संचालित होता है: पहला, मानक आउटपुट को पुनर्निर्देशित किया जाता है foo, फिर, मानक त्रुटि को मानक आउटपुट पर पुनर्निर्देशित किया जाता है, जो अब फ़ाइल है foo। दूसरा उदाहरण, ls 2>&1 > fooइस तरह से संचालित होता है: मानक आउटपुट को रीडायरेक्ट करने से पहले मानक त्रुटि को मानक आउटपुट पर पुनर्निर्देशित किया जाता है foo, इसलिए मानक त्रुटि को स्थानीय रूप से फ़ाइल में निर्देशित किए जाने के बजाय प्रतिध्वनित किया जाता है।
मैट एकर्ट

4
@dpacmittal .. re ls 2>&1 >foo शायद आप इस तरह से सोच सकते हैं। 'ls' से stderr को stdout पर पुनर्निर्देशित किया जाता है। ऐसा ही होगा! यह जहां जाने के लिए वर्तमान में stdout को सौंपा गया है, वहाँ stdout से संबंधित किसी भी निर्देश की परवाह किए बिना .. (क्योंकि यह इसका मुख्य / पहला निर्देश है ) .. तो साथ में एक और निर्देश आता है जो कहता है कि stdout "foo" में जाएगा। और यह करता है ... याद रखें: वास्तव में stderr में स्थानांतरित नहीं किया जा रहा है stdout .. यह सिर्फ जहां निर्देशन के समय stdout सौंपा गया था जाता है । (उदाहरण के लिए, टर्मिनल)
पीटर।

4

मुझे न तो अनुमान है। कोष्ठक की एक जोड़ी का अर्थ है एक उप-खोल। लेकिन इस मामले में, पुनर्निर्देशन के कारण कोई उप-शेल शुरू नहीं किया जाएगा। बैश बस cmd2स्टड में खिलाती है और स्टडआउट को खिलाती है cmd3

मैं सोच रहा हूं, क्या आपका मतलब कुछ ऐसा है cmd1 | cmd2 | cmd3? क्योंकि आपकी cmd2और cmd3आमतौर पर "cmds" के बजाय सामान्य फाइलें हैं।

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