ऑपरेटर वरीयता के साथ क्लासिक परिदृश्य, आपके पास एक पंक्ति है जैसे:
(cd ~/screenshots/ && ls screenshot* | head -n 5)
और आप नहीं जानते कि यह पार्स है ((A && B) | C)या (A && B | C)...
लगभग आधिकारिक दस्तावेज पाया यहाँ सूची में पाइप की सूची नहीं है तो मैं बस तालिका में जांच नहीं कर सकता।
इसके अलावा बाश में, (न केवल संचालन के क्रम को बदलने के लिए है, बल्कि एक उपखंड बनाता है , इसलिए मुझे 100% यकीन नहीं है कि यह लाइनें पिछली पंक्ति के बराबर है:
((cd ~/screenshots/ && ls screenshot*) | head -n 5)
आम तौर पर, कैसे एक बैश लाइन का एएसटी पता करने के लिए ? अजगर में मेरा एक कार्य है जो मुझे पेड़ देता है ताकि मैं ऑपरेशन के क्रम को आसानी से जांच सकूं।
bashएक याक पार्सर का उपयोग कर रहा है कुछ तदर्थ बात नहीं है; यदि आप yacc -vइसे चलाते हैं, तो यह आपको y.outputएक अच्छे व्याकरण में देगा, जो दिखाता है कि &&और ||सूचियों को संयोजित करता है, और सूचियाँ अंततः पाइपलाइनों से बनी होती हैं (और रिवर्स नहीं); tl; डॉ; अपेक्षा के अनुरूप A && B | Cही A && { B | C; }है। Bऔर के बीच निष्पादन के किसी भी आदेश को न मानें C; एक पाइपलाइन में कमांड समानांतर में चलाए जाते हैं ।
[...]परीक्षण और $((...))अंकगणितीय मूल्यांकन के अंदर उपयोग किए जाने वाले ऑपरेटरों के बारे में है ; विशेष रूप से, ||और &&जैसा कि शेल भाषा में कमांड सूची के साथ उपयोग किया जाता है , संबंधित संचालकों के विपरीत Cया अंकगणितीय मूल्यांकन (जहां &&अधिक कसकर बांधता है ||) के विपरीत एक ही पूर्वता है ।
|सिर्फ एक कनेक्टर है जो आरएचएस स्टड के लिए एलएचएस स्टैडआउट को फिट करता है। तो अगरcdआपके उदाहरण में कमांड विफल रहता है, तो यह कोई आउटपुट नहीं भेजेगाhead, लेकिनheadवास्तव में अभी भीexecute, कुछ भी नहीं, और कोई आउटपुट नहीं लौटाएगा।