สถานการณ์สุดคลาสสิกกับโอเปอเรเตอร์สำคัญคุณมีบรรทัดเหมือน:
(cd ~/screenshots/ && ls screenshot* | head -n 5)
และคุณไม่รู้ว่ามันแยกวิเคราะห์((A && B) | C)หรือ(A && B | C)...
เอกสารอย่างเป็นทางการเกือบจะพบที่นี่ไม่ได้แสดงรายการท่อในรายการดังนั้นผมจึงไม่สามารถเพียงแค่ตรวจสอบในตาราง
นอกจากนี้ใน bash (ไม่เพียง แต่เปลี่ยนลำดับการดำเนินการ แต่สร้าง subshellดังนั้นฉันจึงไม่ 100% แน่ใจว่าบรรทัดนี้เทียบเท่ากับบรรทัดก่อนหน้า:
((cd ~/screenshots/ && ls screenshot*) | head -n 5)
โดยทั่วไปแล้วจะรู้ASTของ bash line ได้อย่างไร? ในหลามฉันมีฟังก์ชั่นที่ให้ต้นไม้กับฉันเพื่อให้ฉันสามารถตรวจสอบลำดับการทำงานได้อย่างง่ายดาย
bashใช้parser yacc ไม่ใช่สิ่งที่เฉพาะกิจ หากคุณเรียกใช้ผ่านyacc -vมันจะทำให้คุณy.outputมีไวยากรณ์ที่ดีที่แสดงให้เห็นว่า&&และ||รวมรายการและในที่สุดก็มีรายการของท่อ (และไม่ย้อนกลับ); TL; DR; A && B | Cเป็นเช่นเดียวกับA && { B | C; }ที่คาดไว้ อย่าถือว่าคำสั่งของการดำเนินการระหว่างBและC; คำสั่งในท่อที่มีการทำงานในแบบคู่ขนาน
[...]การทดสอบและ$((...))การประเมินทางคณิตศาสตร์ โดยเฉพาะอย่างยิ่ง||และ&&ตามที่ใช้กับรายการคำสั่งในภาษาของเชลล์มีลำดับความสำคัญเท่ากันซึ่งแตกต่างจากตัวดำเนินการตามลำดับในCหรือในการประเมินทางคณิตศาสตร์ (ที่&&ผูกแน่นกว่า||)
|เป็นเพียงตัวเชื่อมต่อที่เหมาะกับ LHS stdout กับ RHS stdin ดังนั้นหากcdคำสั่งในตัวอย่างของคุณล้มเหลวมันจะไม่ส่งเอาต์พุตไปheadแต่headในความเป็นจริงแล้วยังคงexecuteแยกวิเคราะห์อะไรและส่งคืนไม่มีเอาต์พุต