पुनर्निर्देशन / देव / अशक्त करने के लिए


144

मैं एक उदाहरण bash शेल स्क्रिप्ट पढ़ रहा हूं:

#!/bin/bash

# This script makes a backup of my home directory.

cd /home

# This creates the archive
tar cf /var/tmp/home_franky.tar franky > /dev/null 2>&1

# First remove the old bzip2 file.  Redirect errors because this generates some if the archive
# does not exist.  Then create a new compressed file.
rm /var/tmp/home_franky.tar.bz2 2> /dev/null
bzip2 /var/tmp/home_franky.tar

# Copy the file to another host - we have ssh keys for making this work without intervention.
scp /var/tmp/home_franky.tar.bz2 bordeaux:/opt/backup/franky > /dev/null 2>&1

# Create a timestamp in a logfile.
date >> /home/franky/log/home_backup.log
echo backup succeeded >> /home/franky/log/home_backup.log

मैं यहाँ "/ dev / null 2> & 1" के उपयोग को समझने की कोशिश कर रहा हूँ। सबसे पहले, मुझे लगा कि इस स्क्रिप्ट का उपयोग करता है / dev / null में त्रुटियों को इग्नोर करने के लिए, बिना स्क्रिप्ट को क्रैश किए (जैसे प्रोग्रामिंग भाषाओं में अपवाद को पकड़ने की कोशिश करना) को इग्नोर करना। क्योंकि मैं यह नहीं देखता कि टार फ़ाइल में एक निर्देशिका को संक्षिप्त करने के लिए टार का उपयोग कैसे संभवत: किसी भी प्रकार की त्रुटियों का कारण बन सकता है।


3
पुनर्निर्देशन /dev/nullदुर्घटना को रोकने के लिए नहीं है, लेकिन stdout और stderr उत्पादन धाराओं को साफ करेगा। tarविभिन्न तरीकों से त्रुटियां पैदा कर सकता है। आपके पास लिखने की पहुंच नहीं हो सकती है, फ़ाइल पहले से मौजूद हो सकती है, आदि
Sparhawk

3
अनावश्यक उत्पादन से बचने के लिए बस एक ट्रिक। टार क्यों त्रुटियों का कारण बन सकता है: क्योंकि लक्ष्य निर्देशिका मौजूद नहीं है, क्योंकि स्रोत नहीं है, क्योंकि आपके पास लक्ष्य तक पहुंच नहीं है, या स्रोत को पढ़ें, क्योंकि tarआपके $ पेट में नहीं है, क्योंकि tarदुर्घटनाग्रस्त (आप कभी नहीं जानते), क्योंकि डिवाइस पर कोई जगह नहीं बची है, क्योंकि tarसंस्करण बदल गया है और अब अलग सिंटैक्स की आवश्यकता है, क्योंकि डिस्क में आई / ओ त्रुटि का कारण था। मुझे यकीन है कि आप अधिक पा सकते हैं।
terdon

जवाबों:


223

नहीं, यह स्क्रिप्ट को क्रैश होने से नहीं रोकेगा। यदि tarप्रक्रिया में कोई त्रुटि होती है (उदाहरण के लिए: अनुमति अस्वीकृत, ऐसी कोई फ़ाइल या निर्देशिका, ...) स्क्रिप्ट अभी भी क्रैश नहीं होगी।

क्योंकि उपयोग > /dev/null 2>&1करने से आपके सभी कमांड आउटपुट (दोनों ) stdoutऔर रीडायरेक्ट हो जाएंगे , जिसका अर्थ है कि कोई भी आउटपुट टर्मिनल पर प्रिंट नहीं होता है।stderr/dev/null

डिफ़ॉल्ट रूप से:

stdin  ==> fd 0
stdout ==> fd 1
stderr ==> fd 2

स्क्रिप्ट में, आप उपयोग > /dev/nullकर रहे हैं:

stdin  ==> fd 0
stdout ==> /dev/null
stderr ==> fd 2

और फिर 2>&1कारण:

stdin  ==> fd 0
stdout ==> /dev/null
stderr ==> stdout

3
समझने के रूप में > /dev/null 2>&1, इस आदेश में परिणाम है stderr ==> stdout, तो stderr अभी भी stdout के लिए मुद्रित हो?
वीशी ज़ेंग

11
शायद बहुत महत्वपूर्ण नहीं है, लेकिन क्या है fd?
केव


7
क्यों करता है: CMD > /dev/null 2>&1काम करता है लेकिन फिर CMD 2>&1 > /dev/nullभी मुझे STDERR देता है?
dbmikus

3
अनुशंसित: 2>& 1कोड उदाहरणों में इस बात पर जोर दें कि संख्या और एम्परसेंड को पुनर्निर्देशन ऑपरेटर का हिस्सा माना जाता है। फ़ाइल को पुनर्निर्देशित करना आम है >और बीच में एक स्थान होना चाहिए /path/to/file, फ़ाइल विवरणक पर पुनर्निर्देशन अनिवार्य रूप से एक ही बात है।
हेनक लैंगवेल्ड

21

मैं यहाँ "> / dev / null 2> & 1" के उपयोग को समझने की कोशिश कर रहा हूँ।

(ध्यान दें कि मैंने /dev/nullआपके प्रश्न में पुनर्निर्देशन को पहले जोड़ा था ।)

ऊपर अनुप्रेषित होगा STDOUTऔर STDERRकरने के लिए /dev/null। यह विलय से काम करता है STDERRमें STDOUT। (अनिवार्य रूप से कमांड से सभी आउटपुट को नल डिवाइस पर पुनर्निर्देशित किया जाएगा ।)

... स्क्रिप्ट को क्रैश किए बिना (जैसे प्रोग्रामिंग भाषाओं में अपवाद को पकड़ने की कोशिश की तरह)।

यह काफी एक try/catchया कुछ भी पसंद नहीं है। यह बस चुप्पी आदेश से (त्रुटि सहित) उत्पादन किसी भी प्रकार का।

क्योंकि मैं यह नहीं देखता कि टार फ़ाइल में एक निर्देशिका को संक्षिप्त करने के लिए टार का उपयोग कैसे संभवत: किसी भी प्रकार की त्रुटियों का कारण बन सकता है।

इसमें कई कारणों से त्रुटियां हो सकती हैं, जिनमें शामिल हैं:

  • उस फ़ाइल पर अपर्याप्त अनुमति दें जिसे आप संग्रह करने का प्रयास कर रहे हैं या उस फ़ाइल पर जिसे आप लिखने का प्रयास कर रहे हैं
  • संग्रह बनाने के लिए डिस्क स्थान का अभाव

अच्छी तरह से समझाया।
आदित्य गुप्ता

7

जब आप CMD> / dev / null 2> & 1 चलाते हैं

STDOUT को / dev / null में पुनर्निर्देशित करें, और फिर STDERR STDOUT के ADDRESS को पुनर्निर्देशित करता है, जिसे / dev / null में सेट किया गया है, फलस्वरूप STDOUT और STDERR दोनों / dev / null को इंगित करते हैं

विपरीत, जब आप CMD 2> और 1> / dev / null चलाते हैं

STDERR STDOUT के ADDRESS (उस क्षण में फ़ाइल विवरणक 1, या / proc / self / fd / 1) पर पुनर्निर्देशित करता है, और फिर STDOUT redirects को / dev / null में जोड़ता है, लेकिन STDERR fd1 पर पुनर्निर्देशन करता रहता है !! परिणामस्वरूप STDOUT से सामान्य आउटपुट को छोड़ दिया जाता है, लेकिन STDERR से आने वाली त्रुटियां अभी भी कंसोल पर लिखी जा रही हैं।


-2

बैश I / O पुनर्निर्देशन

चीजों को साफ करने का मुख्य विचार यह है:

रीडायरेक्ट्स को राइट से लेफ्ट पर लागू किया जाता है, जिस तरह से अंग्रेजी बोलने वाले आम तौर पर पढ़ते हैं।


तो यह कोड:

command > filename 2>&1

पुनर्निर्देश stderrकरने के लिए stdout पहले ( 2>&1) और फिर भेजता है stdout(पुनः निर्देशित सहित stderr) के लिए filename( > filename)। यहाँ ABSG स्पष्टीकरण (Ch। 20) है

यह कोड:

command >>/dev/null 2>&1

पुनर्निर्देश stderrऔर stdoutकरने के लिए /dev/null... जो का मतलब कहीं नहीं । भेजी जाने वाली चीजें /dev/nullकिसी भी तरह से बचाई, कैची या याद नहीं की जाती हैं।

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


मैं इस प्रकार के प्रश्न को बहुत कम देखता हूं ... मुख्यतः क्योंकि मुझे इसे स्वयं देखना पड़ता है क्योंकि मैं वर्षों से कोडिंग नहीं कर रहा हूं। यहाँ ABSG से कुछ उपयोगी जानकारी है:

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

2>&1 
# Redirects stderr to stdout.

command >>filename 2>&1
# Appends both stdout and stderr
#+  to the file "filename" ...

ABSG: उन्नत बैश पटकथा गाइड: ऊपर अध्याय 20 लिंक खुला स्रोत की आई / ओ पुनर्निर्देशन पृष्ठ पर एक लिंक है tldp.org नामक दस्तावेज़ के उन्नत बैश पटकथा गाइड मेंडेल कूपर ने। इसे "शेल स्क्रिप्टिंग की कला का गहराई से अन्वेषण" के रूप में सूचीबद्ध किया गया है और मैं बिल्कुल सहमत हूं। यह एक भयानक संसाधन है और इसमें सभी प्रकार की पागल स्थितियों के लिए बहुत सारे उत्तर हैं।

अन्य मूल्यवान संसाधन: लिनक्स डॉक्यूमेंटेशन प्रोजेक्ट गाइड्स पृष्ठ पर वर्तमान / अनुरक्षित खंड (html, पीडीएफ, पाठ आदि जैसे कई आसान स्वरूपों में) में कई मूल्यवान संसाधन हैं । यहाँ कुछ मैं उपयोगी पाया है:


1
नहीं, पुनर्निर्देशन को दाएं से बाएं किया जाता है। आपके उदाहरण में, मानक आउटपुट को पुनर्निर्देशित किया जाता है filename, फिर मानक त्रुटि वर्तमान में (में filename) जा रही है, जहां भी मानक त्रुटि को पुनर्निर्देशित किया जाता है । यदि यह विपरीत तरीका था, तो मानक त्रुटि टर्मिनल पर समाप्त हो जाएगी, जबकि केवल मानक आउटपुट को रीडायरेक्ट किया गया था filename। इसके अलावा, में command >file1 2>file2, file2अगर नहीं बनाया जा होगा file1(चाहे कोई फर्क नहीं पड़ता नहीं बनाया जा सकता है file1और file2वास्तव में पूरी तरह से अलग pathnames थे)।
Kusalananda
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.