इनपुट और आउटपुट का पुनर्निर्देशन किसी भी प्रोग्रामिंग या स्क्रिप्टिंग भाषा का एक स्वाभाविक कार्य है। तकनीकी रूप से, यह स्वाभाविक रूप से तब होता है जब आप किसी कंप्यूटर से इंटरैक्ट करते हैं। इनपुट stdin
. से पढ़ा जाता है (मानक इनपुट, आमतौर पर आपका कीबोर्ड या माउस), आउटपुट stdout
. पर जाता है (मानक आउटपुट, एक टेक्स्ट या डेटा स्ट्रीम), और त्रुटियां stderr
. पर भेजी जाती हैं . यह समझना कि ये डेटा स्ट्रीम मौजूद हैं, आपको यह नियंत्रित करने में सक्षम बनाता है कि जब आप बैश या ज़श जैसे शेल का उपयोग कर रहे हों तो जानकारी कहाँ जाती है।
मानक इन, मानक आउट, और मानक त्रुटि लिनक्स पर फाइल सिस्टम स्थानों के रूप में मौजूद हैं। आप उन्हें /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
called नामक स्ट्रीम में जाते हैं , के रूप में नामित 2>
पुनर्निर्देशन के प्रयोजनों के लिए। यह आदेश त्रुटि संदेशों को output.log
. नामक फ़ाइल में निर्देशित करता है :
$ ls /nope 2> output.log
डेटा को /dev/null पर भेजना
जिस तरह स्टैंडर्ड इन, स्टैंडर्ड आउट और त्रुटि के लिए स्थान होते हैं, उसी तरह कहीं नहीं के लिए भी एक स्थान होता है। लिनक्स फाइल सिस्टम पर। इसे null
कहा जाता है , और यह /dev
. में स्थित है , इसलिए इसे अक्सर उन लोगों द्वारा "devnull" उच्चारित किया जाता है जो इसे "slash dev slash null" कहने के लिए बहुत बार उपयोग करते हैं।
आप /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
पुनर्निर्देशन का उपयोग करना
पुनर्निर्देशन बैश में एक स्थान से दूसरे स्थान पर डेटा प्राप्त करने का एक प्रभावी तरीका है। आप हर समय पुनर्निर्देशन का उपयोग नहीं कर सकते हैं, लेकिन जब आपको इसकी आवश्यकता होती है तो इसका उपयोग करना सीखना आपको बहुत सारी अनावश्यक फ़ाइलों को खोलने और डेटा को कॉपी और पेस्ट करने से बचा सकता है, जिनमें से सभी को आम तौर पर माउस आंदोलन और बहुत सारे कुंजी प्रेस की आवश्यकता होती है। ऐसी चरम सीमाओं का सहारा न लें। अच्छा जीवन जिएं और पुनर्निर्देशन का उपयोग करें।