पुनर्निर्देशन के बारे में कुछ टोटके
इसके बारे में कुछ वाक्य रचना की विशिष्टता में महत्वपूर्ण व्यवहार हो सकते हैं। वहाँ के बारे में पुनर्निर्देशन, कुछ छोटे नमूने है STDERR
, STDOUT
और तर्क आदेश ।
1 - ओवरराइटिंग या एपेंडिंग?
प्रतीक का >
अर्थ है पुनर्निर्देशन ।
>
औसत मौजूद फ़ाइल के रूप में भेजे जाने का मतलब , ओवरराइटिंग लक्ष्य यदि मौजूद है ( # 3 बाद noclobber
में बैश फीचर देखें )।
>>
मतलब अगर मौजूद है तो लक्ष्य के अतिरिक्त भेजना होगा।
किसी भी स्थिति में, यदि वे मौजूद नहीं हैं तो फ़ाइल बनाई जाएगी।
2 - शेल कमांड लाइन आदेश पर निर्भर है !!
इसके परीक्षण के लिए, हमें एक सरल कमांड की आवश्यकता है जो दोनों आउटपुट पर कुछ भेजेगा :
$ ls -ld /tmp /tnt
ls: cannot access /tnt: No such file or directory
drwxrwxrwt 118 root root 196608 Jan 7 11:49 /tmp
$ ls -ld /tmp /tnt >/dev/null
ls: cannot access /tnt: No such file or directory
$ ls -ld /tmp /tnt 2>/dev/null
drwxrwxrwt 118 root root 196608 Jan 7 11:49 /tmp
(उम्मीद है कि आपके पास निर्देशिका नाम नहीं है /tnt
, निश्चित रूप से;)। खैर, हमारे पास है !!
तो, आइए देखें:
$ ls -ld /tmp /tnt >/dev/null
ls: cannot access /tnt: No such file or directory
$ ls -ld /tmp /tnt >/dev/null 2>&1
$ ls -ld /tmp /tnt 2>&1 >/dev/null
ls: cannot access /tnt: No such file or directory
अंतिम कमांड लाइन STDERR
कंसोल को डंप करती है, और यह अपेक्षित व्यवहार नहीं लगता है ... लेकिन ...
यदि आप एक आउटपुट, दूसरे या दोनों के बारे में कुछ पोस्ट फ़िल्टर करना चाहते हैं :
$ ls -ld /tmp /tnt | sed 's/^.*$/<-- & --->/'
ls: cannot access /tnt: No such file or directory
<-- drwxrwxrwt 118 root root 196608 Jan 7 12:02 /tmp --->
$ ls -ld /tmp /tnt 2>&1 | sed 's/^.*$/<-- & --->/'
<-- ls: cannot access /tnt: No such file or directory --->
<-- drwxrwxrwt 118 root root 196608 Jan 7 12:02 /tmp --->
$ ls -ld /tmp /tnt >/dev/null | sed 's/^.*$/<-- & --->/'
ls: cannot access /tnt: No such file or directory
$ ls -ld /tmp /tnt >/dev/null 2>&1 | sed 's/^.*$/<-- & --->/'
$ ls -ld /tmp /tnt 2>&1 >/dev/null | sed 's/^.*$/<-- & --->/'
<-- ls: cannot access /tnt: No such file or directory --->
ध्यान दें कि इस पैराग्राफ में अंतिम कमांड लाइन पिछले पैराग्राफ की तरह ही है, जहां मैंने लिखा था कि यह अपेक्षित व्यवहार नहीं है (इसलिए, यह एक अपेक्षित व्यवहार भी हो सकता है)।
खैर, दोनों आउटपुट पर अलग-अलग ऑपरेशन करने के लिए पुनर्निर्देशन के बारे में थोड़ी तरकीबें हैं
:
$ ( ls -ld /tmp /tnt | sed 's/^/O: /' >&9 ) 9>&2 2>&1 | sed 's/^/E: /'
O: drwxrwxrwt 118 root root 196608 Jan 7 12:13 /tmp
E: ls: cannot access /tnt: No such file or directory
नोट: &9
विवरणक अनायास की वजह से होता है ) 9>&2
।
परिशिष्ट: नोटा! के नए संस्करण के साथदे घुमा के( >4.0
) इस तरह की चीजों को करने के लिए एक नई सुविधा और अधिक सेक्सी वाक्यविन्यास है:
$ ls -ld /tmp /tnt 2> >(sed 's/^/E: /') > >(sed 's/^/O: /')
O: drwxrwxrwt 17 root root 28672 Nov 5 23:00 /tmp
E: ls: cannot access /tnt: No such file or directory
और अंत में ऐसी कैस्केडिंग आउटपुट स्वरूपण के लिए:
$ ((ls -ld /tmp /tnt |sed 's/^/O: /' >&9 ) 2>&1 |sed 's/^/E: /') 9>&1| cat -n
1 O: drwxrwxrwt 118 root root 196608 Jan 7 12:29 /tmp
2 E: ls: cannot access /tnt: No such file or directory
परिशिष्ट: नोटा! एक ही नया वाक्यविन्यास, दोनों तरह से:
$ cat -n <(ls -ld /tmp /tnt 2> >(sed 's/^/E: /') > >(sed 's/^/O: /'))
1 O: drwxrwxrwt 17 root root 28672 Nov 5 23:00 /tmp
2 E: ls: cannot access /tnt: No such file or directory
जहां STDOUT
एक विशिष्ट फिल्टर के माध्यम से, STDERR
दूसरे और अंत में दोनों आउटपुट विलय के माध्यम से एक तीसरे कमांड फिल्टर के माध्यम से जाते हैं।
3 - noclobber
विकल्प और >|
वाक्यविन्यास के बारे में एक शब्द
यह ओवरराइटिंग के बारे में है :
किसी भी मौजूदा फ़ाइल को अधिलेखित नset -o noclobber
करने के लिए बैश करने का निर्देश देते समय , सिंटैक्स आपको इस सीमा से गुजरने देता है:>|
$ testfile=$(mktemp /tmp/testNoClobberDate-XXXXXX)
$ date > $testfile ; cat $testfile
Mon Jan 7 13:18:15 CET 2013
$ date > $testfile ; cat $testfile
Mon Jan 7 13:18:19 CET 2013
$ date > $testfile ; cat $testfile
Mon Jan 7 13:18:21 CET 2013
फ़ाइल को हर बार, अब अच्छी तरह से लिखा गया है:
$ set -o noclobber
$ date > $testfile ; cat $testfile
bash: /tmp/testNoClobberDate-WW1xi9: cannot overwrite existing file
Mon Jan 7 13:18:21 CET 2013
$ date > $testfile ; cat $testfile
bash: /tmp/testNoClobberDate-WW1xi9: cannot overwrite existing file
Mon Jan 7 13:18:21 CET 2013
इससे गुजरें >|
:
$ date >| $testfile ; cat $testfile
Mon Jan 7 13:18:58 CET 2013
$ date >| $testfile ; cat $testfile
Mon Jan 7 13:19:01 CET 2013
इस विकल्प को बंद करने और / या पहले से ही सेट होने पर पूछताछ करना।
$ set -o | grep noclobber
noclobber on
$ set +o noclobber
$ set -o | grep noclobber
noclobber off
$ date > $testfile ; cat $testfile
Mon Jan 7 13:24:27 CET 2013
$ rm $testfile
4 - अंतिम चाल और अधिक ...
दिए गए कमांड से दोनों आउटपुट को रीडायरेक्ट करने के लिए , हम देखते हैं कि एक सही सिंटैक्स हो सकता है:
$ ls -ld /tmp /tnt >/dev/null 2>&1
इस विशेष मामले के लिए, एक शॉर्टकट सिंटैक्स है: &>
... या>&
$ ls -ld /tmp /tnt &>/dev/null
$ ls -ld /tmp /tnt >&/dev/null
नोट: यदि 2>&1
मौजूद है, 1>&2
तो एक सही वाक्यविन्यास भी है:
$ ls -ld /tmp /tnt 2>/dev/null 1>&2
4b- अब, मैं आपको इसके बारे में सोचने दूंगा:
$ ls -ld /tmp /tnt 2>&1 1>&2 | sed -e s/^/++/
++/bin/ls: cannot access /tnt: No such file or directory
++drwxrwxrwt 193 root root 196608 Feb 9 11:08 /tmp/
$ ls -ld /tmp /tnt 1>&2 2>&1 | sed -e s/^/++/
/bin/ls: cannot access /tnt: No such file or directory
drwxrwxrwt 193 root root 196608 Feb 9 11:08 /tmp/
4c- यदि आप अधिक जानकारी में रुचि रखते हैं
आप ठीक मैनुअल को मार कर पढ़ सकते हैं:
man -Len -Pless\ +/^REDIRECTION bash
में दे घुमा के कंसोल ;-)