मेरा प्रश्न पुनर्निर्देशन पूर्वता के बारे में है जो कि मार है। मान लीजिए कि आपके पास एक कमांड है:
cmd1 < cmd2 > cmd3
क्या यह अनुवाद करेगा:
(cmd1 < cmd2) > cmd3
या
cmd1 < (cmd2 > cmd3)
मेरा प्रश्न पुनर्निर्देशन पूर्वता के बारे में है जो कि मार है। मान लीजिए कि आपके पास एक कमांड है:
cmd1 < cmd2 > cmd3
क्या यह अनुवाद करेगा:
(cmd1 < cmd2) > cmd3
या
cmd1 < (cmd2 > cmd3)
जवाबों:
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।
ls > foo 2>&1इसका मतलब यह नहीं होना चाहिए कि foo के लिए रीडायरेक्ट स्टडआउट है फिर स्टडआउट के लिए स्ट्रीडर को रीडायरेक्ट करें। तो यह काम नहीं करना चाहिए। इसी तरह दूसरी कमांड को काम करना चाहिए। मुझे यहां क्या समझ नहीं आ रहा है?
bashआम तौर पर POSIX अनुरूप है, यहां उल्लिखित स्थितियों को छोड़कर , जहां डिफ़ॉल्ट bashव्यवहार भिन्न होता है। bashअधिक अनुरूप बनाने के लिए , आप --posixविकल्प का उपयोग कर सकते हैं ।
ls > foo 2>&1इस तरह संचालित होता है: पहला, मानक आउटपुट को पुनर्निर्देशित किया जाता है foo, फिर, मानक त्रुटि को मानक आउटपुट पर पुनर्निर्देशित किया जाता है, जो अब फ़ाइल है foo। दूसरा उदाहरण, ls 2>&1 > fooइस तरह से संचालित होता है: मानक आउटपुट को रीडायरेक्ट करने से पहले मानक त्रुटि को मानक आउटपुट पर पुनर्निर्देशित किया जाता है foo, इसलिए मानक त्रुटि को स्थानीय रूप से फ़ाइल में निर्देशित किए जाने के बजाय प्रतिध्वनित किया जाता है।
ls 2>&1 >foo शायद आप इस तरह से सोच सकते हैं। 'ls' से stderr को stdout पर पुनर्निर्देशित किया जाता है। ऐसा ही होगा! यह जहां जाने के लिए वर्तमान में stdout को सौंपा गया है, वहाँ stdout से संबंधित किसी भी निर्देश की परवाह किए बिना .. (क्योंकि यह इसका मुख्य / पहला निर्देश है ) .. तो साथ में एक और निर्देश आता है जो कहता है कि stdout "foo" में जाएगा। और यह करता है ... याद रखें: वास्तव में stderr में स्थानांतरित नहीं किया जा रहा है stdout .. यह सिर्फ जहां निर्देशन के समय stdout सौंपा गया था जाता है । (उदाहरण के लिए, टर्मिनल)
मुझे न तो अनुमान है। कोष्ठक की एक जोड़ी का अर्थ है एक उप-खोल। लेकिन इस मामले में, पुनर्निर्देशन के कारण कोई उप-शेल शुरू नहीं किया जाएगा। बैश बस cmd2स्टड में खिलाती है और स्टडआउट को खिलाती है cmd3।
मैं सोच रहा हूं, क्या आपका मतलब कुछ ऐसा है cmd1 | cmd2 | cmd3? क्योंकि आपकी cmd2और cmd3आमतौर पर "cmds" के बजाय सामान्य फाइलें हैं।