2013-09-04 7 views
7

यहां कंक्रीट कार्य है जिसे मैं पूरा करने की कोशिश कर रहा हूं। zsh तरह से मैंबैड में stdout और stderr दोनों को रीडायरेक्ट करने का सही तरीका क्या है?

$ zsh 
$ which clang > /dev/null 2&>1 && echo clang || echo gcc 
clang 
$ which doesntexist > /dev/null 2&>1 && echo doesntexist || echo gcc 
gcc 

तरह बर्ताव करता है लेकिन, पार्टी में:

$ bash 
$ which clang > /dev/null 2&>1 && echo clang || echo gcc 
gcc 

यहाँ सामान्य मामला है:

$ which clang > /dev/null 2&>1; echo $? 
1 
$ which clang; echo $? 
/usr/bin/clang 
0 

वहाँ कुछ मैं कैसे उत्पादन पुनः निर्देशित कर रहा हूँ के साथ गलत है। सही तरीका क्या है?

उत्तर

11

मुझे लगता है कि आप गलत तरीके से रीडायरेक्ट कर रहे:

which clang > /dev/null 2&>1; echo $? 

होना चाहिए

which clang > /dev/null 2>&1; echo $? 

यह शायद कैसे या तो गोले पूर्व विधि अनुमति देते हैं। बाश में यह सही तरीका नहीं है।

which clang >/dev/null 2 &>1; echo $? 

जिसमें 2 एक तर्क के रूप में जोड़ा जाता है: बैश यह बजाय तरह की व्याख्या करेंगे।

आप

e() { echo "[email protected]" >e.log; } 

की तरह एक समारोह बनाने के द्वारा कि सत्यापित करने और के रूप में यह कॉल कर सकते हैं:

e 1 >/dev/null 2&>/dev/null 

और तुम e.log में 1 2 मिलेगा।

बैश में यह भी आसान है अगर आप इस तरह अपने आदेश फोन:

which clang &>/dev/null; echo $? 

इसके अलावा बल्कि which की तरह एक बाहरी द्विआधारी बुला से, type -P बजाय का उपयोग करें। Stderr आउटपुट को पुनर्निर्देशित करने की कोई ज़रूरत नहीं है।

type -P clang >/dev/null; echo $? 
0

इस का उपयोग करें:

which gcc >& /dev/null && echo gcc || echo clang 

इसके अलावा, आप इस का उपयोग कर सकते हैं:

[[ $(which gcc) ]] && echo gcc || echo clang # prints gcc 
[[ $(which clang) ]] && echo gcc || echo clang # prints clang 

यह काम करता है क्योंकि में [[ ]] रिक्त स्ट्रिंग falsey हैं।

3

आप zsh के &> ऑपरेटर का उपयोग कर रहे हैं, जो stderr और stdout को पुनर्निर्देशित करता है। जिस तरह से आपने इसका उपयोग किया है, इसका सुझाव है कि आप इसके बजाय ... > /dev/null 2>&1 का मतलब है।

$ cc=$(type -P clang gcc othercc | head -n 1) 
$ echo $cc 
/usr/bin/clang 
:

मैं के रूप में इस करना होगा

संबंधित मुद्दे