Operatör Önceliği ile klasik senaryo, şöyle bir çizginiz var:
(cd ~/screenshots/ && ls screenshot* | head -n 5)
Ayrıştırılmış mı ((A && B) | C)yoksa (A && B | C)...
Neredeyse resmi belgeler bulundu burada ben sadece tabloda kontrol edemez böylece listede boruyu listelemiyor.
Ayrıca bash, (sadece işlemlerin sırasını değiştirmek için değil , bir alt kabuk oluşturur , bu nedenle bu satırların önceki satırın eşdeğeri olduğundan% 100 emin değilim:
((cd ~/screenshots/ && ls screenshot*) | head -n 5)
Daha genel olarak, bir bash hattının AST'si nasıl bilinir? Python'da, işlem sırasını kolayca iki kez kontrol edebilmem için bana ağacı veren bir fonksiyonum var.
bashgeçici bir şey değil yacc ayrıştırıcı kullanıyor ; Eğer aracılığıyla o çalıştırırsanız yacc -vo size verecektir y.outputgüzel bir gramer gösterileri o &&ve ||listelerini birleştirerek, ve listeler sonunda (ters değil) boru hatları oluşur; tl; dr; beklendiği gibi A && B | Caynıdır A && { B | C; }. Arasındaki yürütme herhangi sırasını düşünmeyin Bve C; bir boru hattındaki komutlar paralel olarak çalıştırılır .
[...]testlerde ve $((...))aritmetik değerlendirmelerde kullanılan operatörlerle ilgilidir ; özellikle ||ve &&kabuk dilindeki komutlar listesiyle kullanıldığı gibi , aritmetik değerlendirmedeki veya aritmetik değerlendirmedeki ( daha sıkı bağlandığında ) ilgili operatörlerin aksine aynı önceliğe sahiptir . C&&||
|sadece LHS stdoutuna RHS stdinine uyan bir konektör olduğunu bilmek yardımcı olabilir . Dolayısıylacd, örneğinizdeki komut başarısız olursa, hiçbir çıktı göndermezhead, ancakheadyineexecutede hiçbir şeyi ayrıştırmaz ve çıktı döndürmez.