किसी भी प्रोग्रामिंग या स्क्रिप्टिंग भाषा में इनपुट और आउटपुट का रीडायरेक्शन एक प्राकृतिक फंक्शन है। तकनीकी रूप से, यह अंतर्निहित रूप से होता है जब भी आप कंप्यूटर के साथ इंटरैक्ट करते हैं। इनपुट stdin (स्टैंडर्ड इनपुट, आमतौर पर आपका कीबोर्ड या माउस) से पढ़ा जाता है, आउटपुट stdout (स्टैंडर्ड आउटपुट, एक टेक्स्ट या डेटा स्ट्रीम) पर जाता है, और त्रुटियां stderr पर भेजी जाती हैं। यह समझना कि ये डेटा स्ट्रीम मौजूद हैं, आपको यह नियंत्रित करने में सक्षम बनाता है कि जब आप बैश या Zsh जैसे शेल का उपयोग कर रहे हों तो जानकारी कहाँ जाती है।
स्टैंडर्ड इन, स्टैंडर्ड आउट, और स्टैंडर्ड एरर लिनक्स पर फाइलसिस्टम स्थानों के रूप में मौजूद हैं। आप उन्हें /dev में देख सकते हैं:
$ ls /dev/std*
/dev/stderr@ /dev/stdin@ /dev/stdout@
आप उनके साथ सीधे ज्यादा कुछ नहीं कर सकते, लेकिन उन्हें उन मेटा-स्थानों के रूप में सोचना कभी-कभी उपयोगी होता है जहां आप डेटा भेज सकते हैं।
रीडायरेक्शन की मूल बातें सरल हैं: आउटपुट को रीडायरेक्ट करने के लिए कुछ संख्या में > वर्णों का उपयोग करें, और इनपुट को रीडायरेक्ट करने के लिए कुछ संख्या में < वर्णों का उपयोग करें।
आउटपुट रीडायरेक्ट करना
ls कमांड के आउटपुट को एक फाइल में लिखने के लिए:
$ ls > list.txt
आप ls के आउटपुट को सामान्य रूप से नहीं देखते, क्योंकि आउटपुट आपकी स्क्रीन के बजाय list.txt फाइल में लिखा जाता है। यह इतना बहुमुखी है, वास्तव में, कि आप इसका उपयोग एक फाइल की सामग्री को दूसरी फाइल में कॉपी करने के लिए भी कर सकते हैं। यह एक टेक्स्ट फाइल होना जरूरी नहीं है। आप बाइनरी डेटा के लिए रीडायरेक्शन का उपयोग कर सकते हैं:
$ cat image.png > picture.png
(यदि आप सोच रहे हैं कि आप ऐसा क्यों करना चाहेंगे, तो यह फाइल अनुमतियों पर कभी-कभी उपयोगी प्रभाव के लिए है।)
इनपुट रीडायरेक्ट करना
आप इनपुट को एक कमांड में "भी" रीडायरेक्ट कर सकते हैं। यह यकीनन आउटपुट रीडायरेक्ट करने से कम उपयोगी है क्योंकि कई कमांड पहले से ही आपके द्वारा प्रदान किए गए तर्क से इनपुट लेने के लिए हार्ड-कोडेड हैं। हालांकि, यह उपयोगी हो सकता है जब एक कमांड तर्कों की एक सूची की उम्मीद करता है, और आपके पास उन तर्कों को एक फाइल में है और आप उन्हें फाइल से अपने टर्मिनल में जल्दी से "कॉपी और पेस्ट" करना चाहते हैं (सिवाय इसके कि आप वास्तव में कॉपी और पेस्ट नहीं करना चाहते):
$ sudo dnf install $(<package.list)
इनपुट रीडायरेक्शन के सामान्य उपयोग हियर-डॉक्यूमेंट (या संक्षेप में हियर-डॉक) और हियर-स्ट्रिंग तकनीकें हैं। यह इनपुट विधि टेक्स्ट के एक ब्लॉक को स्टैंडर्ड इनपुट स्ट्रीम में रीडायरेक्ट करती है, एक विशेष एंड-ऑफ-फाइल मार्कर तक (अधिकांश लोग EOF का उपयोग करते हैं, लेकिन यह कोई भी स्ट्रिंग हो सकती है जिसे आप अद्वितीय होने की उम्मीद करते हैं)। इसे (दूसरे EOF उदाहरण तक) टर्मिनल में टाइप करने का प्रयास करें:
$ echo << EOF
> foo
> bar
> baz
> EOF
अपेक्षित परिणाम:
foo
bar
baz
एक हियर-डॉक बैश स्क्रिप्टर्स द्वारा कई लाइनों के टेक्स्ट को एक फाइल पर या स्क्रीन पर डंप करने के लिए इस्तेमाल की जाने वाली एक सामान्य ट्रिक है। जब तक आप अपने एंड-ऑफ-फाइल मार्कर के साथ क्लॉज को समाप्त करना नहीं भूलते, यह echo या printf स्टेटमेंट की बोझिल सूचियों से बचने का एक प्रभावी तरीका है।
एक हियर-स्ट्रिंग एक हियर-डॉक के समान है, लेकिन इसमें केवल एक स्ट्रिंग (या कई स्ट्रिंग्स जो उद्धरण चिह्नों के साथ एक सिंगल स्ट्रिंग के रूप में प्रच्छन्न हैं) होती है:
$ cat <<< "foo bar baz"
foo bar baz
त्रुटि संदेश रीडायरेक्ट करना
त्रुटि संदेश stderr नामक एक स्ट्रीम पर जाते हैं, जिसे रीडायरेक्शन के उद्देश्यों के लिए 2> के रूप में नामित किया गया है। यह कमांड त्रुटि संदेशों को output.log नामक फाइल में निर्देशित करता है:
$ ls /nope 2> output.log
डेटा को /dev/null भेजना
जिस तरह स्टैंडर्ड इन, स्टैंडर्ड आउट, और एरर के लिए स्थान हैं, लिनक्स फाइलसिस्टम पर कहीं नहीं के लिए भी एक स्थान है। इसे null कहा जाता है, और यह /dev में स्थित है, इसलिए इसे अक्सर उन लोगों द्वारा "devnull" कहा जाता है जो इसे "स्लैश देव स्लैश नल" कहने के लिए बहुत बार उपयोग करते हैं।
आप रीडायरेक्शन का उपयोग करके डेटा को /dev/null भेज सकते हैं। उदाहरण के लिए, find कमांड वर्बोज़ होता है, और यह अक्सर आपकी फाइलों के माध्यम से खोजते समय अनुमति संघर्षों की रिपोर्ट करता है:
$ find ~ -type f
/home/seth/actual.file
find: `/home/seth/foggy': Permission denied
find: `/home/seth/groggy': Permission denied
find: `/home/seth/soggy': Permission denied
/home/seth/zzz.file
find कमांड इसे एक त्रुटि के रूप में प्रोसेस करता है, इसलिए आप केवल त्रुटि संदेशों को /dev/null पर रीडायरेक्ट कर सकते हैं:
$ find ~ -type f 2> /dev/null
/home/seth/actual.file
/home/seth/zzz.file
रीडायरेक्शन का उपयोग करना
रीडायरेक्शन बैश में एक स्थान से दूसरे स्थान पर डेटा प्राप्त करने का एक कुशल तरीका है। आप हर समय रीडायरेक्शन का उपयोग नहीं कर सकते हैं, लेकिन जब आपको इसकी आवश्यकता होती है तो इसका उपयोग करना सीखना आपको अनावश्यक रूप से फाइलें खोलने और डेटा कॉपी और पेस्ट करने में बहुत समय बचा सकता है, जिनमें आमतौर पर माउस मूवमेंट और बहुत सारे की प्रेस की आवश्यकता होती है। ऐसे चरम उपायों का सहारा न लें। अच्छा जीवन जिएं और रीडायरेक्शन का उपयोग करें।