कमांड-लाइन इंटरफ़ेस की दुनिया में प्रोग्राम अक्सर तीन मानक डेटा स्ट्रीम के साथ काम करते हैं:
stdin): जहाँ से प्रोग्राम अपना इनपुट लेता है (आमतौर पर कीबोर्ड से)।stdout): जहाँ प्रोग्राम अपना सामान्य आउटपुट भेजता है (आमतौर पर टर्मिनल स्क्रीन पर)।stderr): जहाँ प्रोग्राम एरर संदेश भेजता है (आमतौर पर टर्मिनल स्क्रीन पर)।याद कीजिए, हमने इन्हें पाइपलाइन और कमांड सूचियाँ अध्याय में पेश किया था।
पाइपलाइन को रीडायरेक्शन का ही एक रूप माना जा सकता है: एक प्रोग्राम का मानक आउटपुट सीधे दूसरे प्रोग्राम के मानक इनपुट को भेज दिया जाता है। हम पाइपलाइन पहले ही समझ चुके हैं। यह कॉन्सेप्ट बताएगा कि फाइलों से और फाइलों में रीडायरेक्ट कैसे करें।
शेल रीडायरेक्शन एक शक्तिशाली तरीका है जिससे आप इन स्ट्रीम का गंतव्य बदल सकते हैं। किसी प्रोग्राम के कीबोर्ड से पढ़ने या स्क्रीन पर लिखने के बजाय, आप इनपुट को किसी फाइल से रीडायरेक्ट कर सकते हैं या आउटपुट किसी फाइल में भेज सकते हैं। इससे प्रोग्राम डेटा के साथ कैसे काम करते हैं, इस पर काफी लचीलापन और नियंत्रण मिलता है।
यहाँ सबसे आम रीडायरेक्शन ऑपरेटर दिए गए हैं और वे क्या करते हैं:
> (आउटपुट रीडायरेक्शन)उद्देश्य: किसी कमांड के मानक आउटपुट (stdout) को किसी फाइल में रीडायरेक्ट करना।
व्यवहार:
उदाहरण:
# Sends the output of 'ls -l' to 'file_listing.txt'
ls -l > file_listing.txt
रीडायरेक्शन कमांड के चलने से पहले ही हो जाता है। इसका मतलब है कि आप उसी फाइल में रीडायरेक्ट नहीं कर सकते जिसे आपको पढ़ना है।
date > date.txt # populate the file with the current date
cat date.txt > date.txt # 'date.txt' is now empty!
ऊपर दिए उदाहरण की दूसरी कमांड में,
>> (आउटपुट जोड़ने वाला रीडायरेक्शन)उद्देश्य: किसी कमांड के मानक आउटपुट (stdout) को किसी फाइल के अंत में जोड़ना।
व्यवहार:
उदाहरण:
# Adds "Another line" to the end of the file
echo "Another line" >> file_listing.txt
< (इनपुट रीडायरेक्शन)उद्देश्य: किसी कमांड के मानक इनपुट (stdin) को किसी फाइल से रीडायरेक्ट करना।
व्यवहार: कमांड अपना इनपुट कीबोर्ड के बजाय बताई गई फाइल से पढ़ता है।
उदाहरण:
# 'tr' reads from 'lowercase.txt' and
# output is redirected to 'uppercase.txt'
tr 'a-z' 'A-Z' < lowercase.txt > uppercase.txt
2> (एरर रीडायरेक्शन):stderr) को किसी फाइल में रीडायरेक्ट करना।# Error message from 'rm' is sent to 'error_log.txt'
rm non_existent_file 2> error_log.txt
आप 2>> की मदद से मानक एरर को किसी फाइल में जोड़ सकते हैं।
कुछ रीडायरेक्शन ऐसे भी हैं जो stdin और stderr दोनों को एक साथ मिला सकते हैं।
विवरण के लिए मैनुअल देखिए।
/dev/null/dev/null एक खास फाइल है जो
इसे कभी-कभी "बिटबकेट" भी कहा जाता है। यह आउटपुट या एरर को दबाने के लिए उपयोगी है।
some_command > /dev/null # Discards stdout
some_command 2> /dev/null # Discards stderr
# Using /dev/null as input will prevent the command
# from reading data from the keyboard
some_command < /dev/null
एक साथ कई रीडायरेक्शन दिए जा सकते हैं।
some_command < input.txt > output.txt 2> error.txt
एक रीडायरेक्शन की नकल भी की जा सकती है।
# send stderr to the same destination as stdout
some_command > output.txt 2>&1
जब आप 2>&1 देखें, तो इसे ऐसे पढ़िए: "मानक एरर को वहीं भेजो जहाँ stdout इस समय इशारा कर रहा है"।
Bash रीडायरेक्शन के निर्देशों को बिल्कुल बाएँ से दाएँ क्रम में पढ़ता है, जिसका मतलब है कि आप यह कर सकते हैं:
# redirect stdout to 'output1.txt'
# redirect stderr to the same place
# then change stdout to 'output2.txt'
some_command > output1.txt 2>&1 > output2.txt
शेल प्रोग्रामिंग और Linux/Unix जैसे ऑपरेटिंग सिस्टम में, फाइल डिस्क्रिप्टर (FD) एक ऋणेतर पूर्णांक होता है, यानी शून्य या उससे बड़ा। यह किसी खुली फाइल या I/O (इनपुट/आउटपुट) संसाधन के लिए एक पहचान या हैंडल का काम करता है। इसे ऐसे समझिए जैसे कोई लेबल या संदर्भ संख्या, जिसका इस्तेमाल ऑपरेटिंग सिस्टम खुली फाइलों और डेटा स्ट्रीम पर नज़र रखने के लिए करता है।
रीडायरेक्शन के बाईं ओर आपको जो संख्याएँ दिखती हैं, वे फाइल डिस्क्रिप्टर होती हैं।
मानक I/O स्ट्रीम को पहले 3 फाइल डिस्क्रिप्टर दिए जाते हैं:
exec कमांड और रीडायरेक्शन ऑपरेटरों की मदद से नए फाइल डिस्क्रिप्टर सेट या बनाए जा सकते हैं।
# create FD 3 as a copy of stdout
exec 3>&1
# send stdout to a log file
exec > log.txt
# then redirect both stdout and file descriptor 3
echo "some debug message" >&3 # displayed in the terminal
some_command 2>&1 # stdout and stderr send to 'log.txt'
यह तरीका काफी उलझा हुआ लगता है, लेकिन यह ऐसी स्थितियों में बहुत काम आ सकता है जहाँ आपकी स्क्रिप्ट को कोई और सॉफ्टवेयर पैकेज चलाता है और मानक आउटपुट अपने आप उस सॉफ्टवेयर द्वारा पकड़ लिया जाता है।
इस ट्रैक के यूनिट टेस्ट चलाने के लिए जो bats कमांड इस्तेमाल होता है, वह इसी तरह काम करता है: bats किसी टेस्ट के stdout और stderr को पकड़ लेता है, लेकिन FD 3 पर भेजे गए डीबग संदेश टर्मिनल पर दिखाए जाते हैं।
रीडायरेक्शन क्यों उपयोगी है?
शेल रीडायरेक्शन आपको इस पर बारीक नियंत्रण देते हैं कि प्रोग्राम डेटा के साथ कैसे काम करते हैं। इससे आप जटिल वर्कफ्लो बना सकते हैं और जानकारी को कुशलता से संभाल सकते हैं।