बैश और zsh में && बनाम की वरीयता


9

उत्तर देना इस सवाल का मैं में व्यवहार के बीच एक बहुत ही अजीब (और सूक्ष्म) अंतर की खोज की bashऔर zsh:

इन bash:

romano@RRyS:~$ pwd
/home/romano
romano@RRyS:~$ alias x="cd /bin && ./echo A >/dev/null  &"
romano@RRyS:~$ x
[1] 16611
romano@RRyS:~$ pwd
/home/romano

जैसा कि आप देख सकते हैं, उपनाम xका निष्पादन एक उपधारा में किया जाता है और इसलिए वर्तमान निर्देशिका नहीं बदलती है।

इसमें नहीं zsh:

[romano:~] % pwd
/home/romano
[romano:~] % alias x="cd /bin && ./echo A >/dev/null &"
[romano:~] % x
[1] 16744
[1]  + 16744 done       ./echo A >/dev/null                                    
1& [romano:/bin] % pwd
/bin
[romano:/bin] % 

यहां निर्देशिका बदली गई है।

ऐसा लगता है कि &में bashकी तुलना में एक अलग प्राथमिकता है zsh--- मेरा मतलब है, आदेश के रूप में पढ़ा जा रहा है

(cd /tmp && echo A) & 

में bashऔर के रूप में

cd /tmp && (echo A &) 

में है zsh। क्या यह सही है या अलग व्यवहार का कारण एक और है?

जवाबों:


9

में अलग, प्रलेखित व्यवहार zshmisc

सूची शून्य या अधिक उप-सूचियों, जिसमें प्रत्येक sublist से समाप्त हो जाता है का एक क्रम है ;, &, &|, &!, या एक नई पंक्ति। सूची के अंदर (...)या एक जटिल कमांड के रूप में प्रकट होने पर यह टर्मिनेटर वैकल्पिक रूप से सूची में अंतिम सबलिस्ट से छोड़ा जा सकता है {...}। जब एक सबलिस्ट को ;या न्यूलाइन द्वारा समाप्त किया जाता है , तो शेल अगली सबलिस्ट को निष्पादित करने से पहले समाप्त होने का इंतजार करता है। यदि एक उप a सूची ए &, &|या &!, द्वारा समाप्त हो जाती है , तो पृष्ठभूमि में अंतिम पाइपलाइन इसमें शेल निष्पादित करती है, और इसके खत्म होने का इंतजार नहीं करती है (अन्य शेल से अंतर को नोट करें जो पृष्ठभूमि में पूरे सबलिस्ट को निष्पादित करता है)। एक पृष्ठभूमि वाली पाइपलाइन शून्य की स्थिति देती है।


3

zshmisc(1)निम्नलिखित पंक्ति में दफन है:

यदि किसी सबलिस्ट को a। &',| ', या `&' के द्वारा समाप्त किया जाता है , तो पृष्ठभूमि में अंतिम पाइपलाइन में शेल निष्पादित होता है,

हालांकि यह विशेष रूप से यह नहीं बताता है कि सबलिस्ट में अन्य पाइपलाइनों को वर्तमान शेल में निष्पादित किया जाता है, ऐसा प्रतीत होता है कि यह क्या आसन्न है, और आपके द्वारा किया गया व्यवहार उस व्याख्या का समर्थन करता है। उदाहरण के लिए:

$ echo $foo $bar

$ foo=3 && bar=5 && sleep 1 &
$ echo $foo $bar
3 5

इस धारणा का भी समर्थन करता है कि पहले दो पाइपलाइन वर्तमान शेल में निष्पादित होते हैं, और पृष्ठभूमि में वास्तव में सबलिस्ट की अंतिम पाइपलाइन निष्पादित होती है।

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