&>> और 2> और 1 के बीच अंतर पुनर्निर्देशन


12

पर इस अतः धागा और कुछ अन्य धागे मैं रीडायरेक्ट करने के लिए निम्न कमांड को देखा है stdoutऔर stderrएक फाइल करने के लिए।

क्या वे सभी समान हैं? क्या उनके बीच कोई अंतर है?

command1 >> logfile 2>&1
command &> logfile
command >& logfile

1
अंतिम दो समतुल्य हैं: stackoverflow.com/q/11255447/1032785
jordanm

जवाबों:


7

जब से आपने टैग किया है zsh, मैं आपको बता दूं कि सभी 3 पुनर्निर्देशन बिल्कुल उसी तरह से काम करते हैं। जैसा कि आपने दोनों डुप्लिकेट पोस्टों (टिप्पणी में एक और आपकी पोस्ट में एक) में पढ़ा होगा, वे सभी को पुनर्निर्देशित stderrकरते हैं, stdoutजिसमें इंटर्न को फाइल 'लॉगफाइल' पर रीडायरेक्ट किया जाता है (यानी, लॉगफाइल में आउटपुट और एरर दोनों होंगे। )।

लेकिन उनका व्यवहार आपके द्वारा किए गए शेल के आधार पर बहुत कुछ बदलता है।

सभी पुनर्निर्देशन के तीन शैलियों में एक ही तरह से अच्छी तरह से काम करता है bashऔरzsh

परंतु:

या >&में ही काम करता हैcshtcsh

[soum@server ~]$  ./test.sh > logfile 2>&1
Ambiguous output redirect.
[soum@server ~]$ ./test.sh &> logfile
Invalid null command.
[soum@server ~]$ ./test.sh >& logfile
[soum@server ~]$ echo $SHELL
/bin/tcsh
[soum@server ~]$

में kshकेवल 2>&1काम करता है।

$ ./test.sh >& logfile
-ksh: logfile: bad file unit number
$ ./test.sh &> logfile
[1]     23039
$ 1  2  3  4  5  6  logfile  test.sh
ls: cannot access ttr: No such file or directory

[1] +  Done(2)                 ./test.sh &> logfile

मुझे नफरत है ksh। जबकि >&बस एक त्रुटि दी, &>आदेश का एक हिस्सा पृष्ठभूमि में और logfile (यदि खाली नहीं है) खाली कर दिया।


1
क्या मतलब था तुम्हारा sh? यदि यह POSIX शेल है, &>और >&काम नहीं करेगा।
cuonglm

अफसोस की बात है कि पहला बयान तथ्यात्मक रूप से गलत है। क्लोब बनाम अपेंड के लिए मेरा जवाब देखें।
टॉम हेल

1

&>और >&अर्ध-समतुल्यता (क्लोबर)

zshमैनुअल पुनर्निर्देशन अनुभाग कि कहते हैं:

  • &>
  • >&

समतुल्य हैं।

दोनों फाइल को क्लॉबर करेंगे - इसे लिखने से पहले फाइल को 0 बाइट्स पर काट दें, जैसे > fileएसटीडीआईएन-केस में होता है।

हालाँकि , bashमैन्युअल पुनर्निर्देशन अनुभाग कहता है कि:

दो रूपों में से, पहले को प्राथमिकता दी जाती है। यह शब्दार्थ के बराबर है

>word 2>&1

दूसरे रूप का उपयोग करते समय, शब्द किसी संख्या में विस्तारित नहीं हो सकता है -। यदि ऐसा होता है, तो अन्य पुनर्निर्देशन ऑपरेटर अनुकूलता कारणों से (नीचे डुप्लिकेटिंग फ़ाइल डिस्क्रिप्टर्स देखें) लागू होते हैं।

इसलिए, जब आप टैग करते हैं, तो zshयह संभव है कि पहली बार उंगली की मेमोरी प्राप्त करने के लिए अच्छा अभ्यास हो bash

>> logfile 2>&1और &>>समतुल्यता (परिशिष्ट)

यहां, logfileओवरराइट नहीं किया गया है, लेकिन फ़ाइल के अंत में लिखने के लिए खोला गया है, अर्थात एपेंड मोड ( O_APPEND)।

दोनों में बराबर {ba,z}shहै:

command1 &>> logfile

में bash:

मानक आउटपुट और मानक त्रुटि को लागू करने का प्रारूप है:

&>>word

यह शब्दार्थ के बराबर है

>>word 2>&1

(नीचे डुप्लिकेट फ़ाइल डिस्क्रिप्टर्स देखें)।

(नोट: का क़त्ले आम उपयोग &>से अधिक >&खंड में ऊपर है फिर से दिया की सिफारिश की वहाँ में जोड़कर के लिए सिर्फ एक ही रास्ता है bash।)

zshदोनों की अनुमति देता है &>>और >>&रूपों।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.