डुप्लीकेशन वास्तव में यहाँ का महत्वपूर्ण हिस्सा है।
आइए देखें कि पुनर्निर्देशन से पहले फ़ाइल विवरणक कहां जा रहे हैं। यह आम तौर पर वर्तमान टर्मिनल है, उदाहरण के लिए:
STDOUT ---> /dev/pts/1
STDERR ---> /dev/pts/1
अब, यदि हम ls -lपुनर्निर्देशन के बिना कॉल करते हैं, तो आउटपुट और त्रुटि संदेश मेरे टर्मिनल पर जाते हैं /dev/pts/1।
यदि हम पहली बार STDOUTकिसी फ़ाइल ( ls -l > dirlist) में रीडायरेक्ट करते हैं , तो यह इस तरह दिखता है:
STDOUT ---> /home/bon/dirlist
STDERR ---> /dev/pts/1
जब हम फिरSTDERR से फ़ाइल डिस्क्रिप्टर ( ) के डुप्लिकेट पर पुनर्निर्देशित करते हैं, तो एक डुप्लिकेट पर जाता है :STDOUTls -l > dirlist 2>&1STDERR/home/bon/dirlist
STDOUT ---> /home/bon/dirlist
STDERR ---> /home/bon/dirlist
यदि हम पहले फ़ाइल डिस्क्रिप्टर ( ) के STDERRडुप्लिकेट पर पुनर्निर्देशित करेंगे :STDOUTls -l 2>&1
STDOUT ---> /dev/pts/1
STDERR ---> /dev/pts/1
और फिर STDOUT एक फ़ाइल ( ls -l 2>&1 > dirlist) में, हमें यह मिलेगा:
STDOUT ---> /home/bon/dirlist
STDERR ---> /dev/pts/1
यहाँ, STDERRअभी भी टर्मिनल जा रहा है।
आप देखें, मैन पेज में ऑर्डर सही है।
परीक्षण पुनर्निर्देशन
अब, आप खुद को परख सकते हैं। उपयोग करते हुए ls -l /proc/$$/fd/, आप देखते हैं कि कहां STDOUT(fd 1 के साथ) और STDERR(fd 2 के साथ), वर्तमान प्रक्रिया के लिए जा रहे हैं:
$ ls -l /proc/$$/fd/
total 0
lrwx------ 1 bon bon 64 Jul 24 18:19 0 -> /dev/pts/1
lrwx------ 1 bon bon 64 Jul 24 18:19 1 -> /dev/pts/1
lrwx------ 1 bon bon 64 Jul 24 07:41 2 -> /dev/pts/1
lrwx------ 1 bon bon 64 Jul 24 18:19 255 -> /dev/pts/1
चलिए एक छोटी सी शेल स्क्रिप्ट बनाते हैं जो यह दर्शाती है कि आपकी फ़ाइल डिस्क्रिप्टर कहाँ इंगित की गई है। इस तरह, हम हमेशा lsकॉलिंग शेल से किसी भी पुनर्निर्देशन सहित, कॉल करते समय राज्य प्राप्त करते हैं ।
$ cat > lookfd.sh
#!/bin/sh
ls -l /proc/$$/fd/
^D
$ chmod +x lookfd.sh
(के साथ CtrlD, आप एक अंतिम फ़ाइल भेजते हैं और इसलिए catकमांड पढ़ने से रोकते हैं STDIN।)
अब, पुनर्निर्देशन के अलग-अलग संयोजनों के साथ इस स्क्रिप्ट को कॉल करें:
$ ./lookfd.sh
total 0
lrwx------ 1 bon bon 64 Jul 24 19:08 0 -> /dev/pts/1
lrwx------ 1 bon bon 64 Jul 24 19:08 1 -> /dev/pts/1
lrwx------ 1 bon bon 64 Jul 24 19:08 2 -> /dev/pts/1
lr-x------ 1 bon bon 64 Jul 24 19:08 255 -> /home/bon/lookfd.sh
$ ./lookfd.sh > foo.out
$ cat foo.out
total 0
lrwx------ 1 bon bon 64 Jul 24 19:10 0 -> /dev/pts/1
l-wx------ 1 bon bon 64 Jul 24 19:10 1 -> /home/bon/foo.out
lrwx------ 1 bon bon 64 Jul 24 19:10 2 -> /dev/pts/1
lr-x------ 1 bon bon 64 Jul 24 19:10 255 -> /home/bon/lookfd.sh
$ ./lookfd.sh 2>&1 > foo.out
$ cat foo.out
total 0
lrwx------ 1 bon bon 64 Jul 24 19:10 0 -> /dev/pts/1
l-wx------ 1 bon bon 64 Jul 24 19:10 1 -> /home/bon/foo.out
lrwx------ 1 bon bon 64 Jul 24 19:10 2 -> /dev/pts/1
lr-x------ 1 bon bon 64 Jul 24 19:10 255 -> /home/bon/lookfd.sh
$ ./lookfd.sh > foo.out 2>&1
$ cat foo.out
total 0
lrwx------ 1 bon bon 64 Jul 24 19:11 0 -> /dev/pts/1
l-wx------ 1 bon bon 64 Jul 24 19:11 1 -> /home/bon/foo.out
l-wx------ 1 bon bon 64 Jul 24 19:11 2 -> /home/bon/foo.out
lr-x------ 1 bon bon 64 Jul 24 19:11 255 -> /home/bon/lookfd.sh
आप देख सकते हैं, कि फ़ाइल डिस्क्रिप्टर 1 (के लिए STDOUT) और 2 (के लिए STDERR) भिन्न हैं। मज़े के लिए, आप रिडायरेक्ट भी कर सकते STDINहैं और परिणाम देख सकते हैं :
$ ./lookfd.sh < /dev/zero
total 0
lr-x------ 1 bon bon 64 Jul 24 19:18 0 -> /dev/zero
lrwx------ 1 bon bon 64 Jul 24 19:18 1 -> /dev/pts/1
lrwx------ 1 bon bon 64 Jul 24 19:18 2 -> /dev/pts/1
lr-x------ 1 bon bon 64 Jul 24 19:18 255 -> /home/bon/lookfd.sh
(पाठक के लिए छोड़ दिया गया सवाल: फाइल डिस्क्रिप्टर 255 पॉइंट कहाँ है? ;-))