ट्रैक
/
Bash
Bash
/
सिलेबस
/
रिडायरेक्शन
रि

रिडायरेक्शन में Bash

{one: "1 अभ्यास", other: "%{count} अभ्यास"}

रिडायरेक्शन के बारे में

कमांड-लाइन इंटरफ़ेस की दुनिया में प्रोग्राम अक्सर तीन मानक डेटा स्ट्रीम के साथ काम करते हैं:

  1. मानक इनपुट (stdin): जहाँ से प्रोग्राम अपना इनपुट लेता है (आमतौर पर कीबोर्ड से)।
  2. मानक आउटपुट (stdout): जहाँ प्रोग्राम अपना सामान्य आउटपुट भेजता है (आमतौर पर टर्मिनल स्क्रीन पर)।
  3. मानक एरर (stderr): जहाँ प्रोग्राम एरर संदेश भेजता है (आमतौर पर टर्मिनल स्क्रीन पर)।

याद कीजिए, हमने इन्हें पाइपलाइन और कमांड सूचियाँ अध्याय में पेश किया था।

Note

पाइपलाइन को रीडायरेक्शन का ही एक रूप माना जा सकता है: एक प्रोग्राम का मानक आउटपुट सीधे दूसरे प्रोग्राम के मानक इनपुट को भेज दिया जाता है। हम पाइपलाइन पहले ही समझ चुके हैं। यह कॉन्सेप्ट बताएगा कि फाइलों से और फाइलों में रीडायरेक्ट कैसे करें।

शेल रीडायरेक्शन एक शक्तिशाली तरीका है जिससे आप इन स्ट्रीम का गंतव्य बदल सकते हैं। किसी प्रोग्राम के कीबोर्ड से पढ़ने या स्क्रीन पर लिखने के बजाय, आप इनपुट को किसी फाइल से रीडायरेक्ट कर सकते हैं या आउटपुट किसी फाइल में भेज सकते हैं। इससे प्रोग्राम डेटा के साथ कैसे काम करते हैं, इस पर काफी लचीलापन और नियंत्रण मिलता है।

मुख्य रीडायरेक्शन ऑपरेटर

यहाँ सबसे आम रीडायरेक्शन ऑपरेटर दिए गए हैं और वे क्या करते हैं:

> (आउटपुट रीडायरेक्शन)

  • उद्देश्य: किसी कमांड के मानक आउटपुट (stdout) को किसी फाइल में रीडायरेक्ट करना।

  • व्यवहार:

    • अगर फाइल मौजूद नहीं है, तो वह बन जाती है।
    • अगर फाइल पहले से है, तो उसकी सामग्री के ऊपर नई सामग्री लिख दी जाती है।
  • उदाहरण:

    # Sends the output of 'ls -l' to 'file_listing.txt'
    ls -l > file_listing.txt
    
Caution

रीडायरेक्शन कमांड के चलने से पहले ही हो जाता है। इसका मतलब है कि आप उसी फाइल में रीडायरेक्ट नहीं कर सकते जिसे आपको पढ़ना है।

date > date.txt         # populate the file with the current date
cat date.txt > date.txt # 'date.txt' is now empty!

ऊपर दिए उदाहरण की दूसरी कमांड में,

  1. Bash सबसे पहले रीडायरेक्शन में बताई गई फाइल को काट देता है। इससे उसकी पुरानी सामग्री नष्ट हो जाती है और एक खाली फाइल बच जाती है।
  2. फिर bash इस अभी खाली हुई फाइल को पढ़ता है।
  3. फिर bash उस सामग्री (यानी कुछ भी नहीं) को वापस फाइल में लिख देता है।

>> (आउटपुट जोड़ने वाला रीडायरेक्शन)

  • उद्देश्य: किसी कमांड के मानक आउटपुट (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
Advanced

फाइल डिस्क्रिप्टर

शेल प्रोग्रामिंग और Linux/Unix जैसे ऑपरेटिंग सिस्टम में, फाइल डिस्क्रिप्टर (FD) एक ऋणेतर पूर्णांक होता है, यानी शून्य या उससे बड़ा। यह किसी खुली फाइल या I/O (इनपुट/आउटपुट) संसाधन के लिए एक पहचान या हैंडल का काम करता है। इसे ऐसे समझिए जैसे कोई लेबल या संदर्भ संख्या, जिसका इस्तेमाल ऑपरेटिंग सिस्टम खुली फाइलों और डेटा स्ट्रीम पर नज़र रखने के लिए करता है।

रीडायरेक्शन के बाईं ओर आपको जो संख्याएँ दिखती हैं, वे फाइल डिस्क्रिप्टर होती हैं।

मानक I/O स्ट्रीम को पहले 3 फाइल डिस्क्रिप्टर दिए जाते हैं:

  • मानक इनपुट FD 0 है
  • मानक आउटपुट FD 1 है
  • मानक एरर FD 2 है

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 पर भेजे गए डीबग संदेश टर्मिनल पर दिखाए जाते हैं।

सारांश में

रीडायरेक्शन क्यों उपयोगी है?

  • आउटपुट सहेजना: किसी कमांड के परिणाम बाद में देखने या उन पर काम करने के लिए संग्रहीत कीजिए।
  • लॉगिंग: डीबगिंग के लिए एरर संदेशों को पकड़िए।
  • ऑटोमेशन: कमांडों को एक साथ जोड़िए, जिसमें एक का आउटपुट दूसरे का इनपुट बन जाता है।
  • फ़िल्टरिंग: अनचाहे आउटपुट को हटाइए।
  • बैच प्रोसेसिंग: फाइलों से डेटा प्रोसेस कीजिए, उसे हाथ से टाइप करने के बजाय।
  • स्क्रिप्टिंग: मज़बूत शेल स्क्रिप्ट लिखने के लिए रीडायरेक्शन आवश्यक हैं।

शेल रीडायरेक्शन आपको इस पर बारीक नियंत्रण देते हैं कि प्रोग्राम डेटा के साथ कैसे काम करते हैं। इससे आप जटिल वर्कफ्लो बना सकते हैं और जानकारी को कुशलता से संभाल सकते हैं।

GitHub के ज़रिए संपादित करें यह लिंक नई विंडो या टैब में खुलता है।