डुप्लीकेशन वास्तव में यहाँ का महत्वपूर्ण हिस्सा है।
आइए देखें कि पुनर्निर्देशन से पहले फ़ाइल विवरणक कहां जा रहे हैं। यह आम तौर पर वर्तमान टर्मिनल है, उदाहरण के लिए:
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
से फ़ाइल डिस्क्रिप्टर ( ) के डुप्लिकेट पर पुनर्निर्देशित करते हैं, तो एक डुप्लिकेट पर जाता है :STDOUT
ls -l > dirlist 2>&1
STDERR
/home/bon/dirlist
STDOUT ---> /home/bon/dirlist
STDERR ---> /home/bon/dirlist
यदि हम पहले फ़ाइल डिस्क्रिप्टर ( ) के STDERR
डुप्लिकेट पर पुनर्निर्देशित करेंगे :STDOUT
ls -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 पॉइंट कहाँ है? ;-))