Skenario klasik dengan Operator Precedence, Anda memiliki garis seperti:
(cd ~/screenshots/ && ls screenshot* | head -n 5)
Dan Anda tidak tahu apakah itu diuraikan ((A && B) | C)
atau (A && B | C)
...
The dokumentasi hampir resmi ditemukan di sini tidak mencantumkan pipa dalam daftar jadi saya tidak bisa hanya memeriksa di meja.
Selanjutnya dalam bash, (
tidak hanya untuk mengubah urutan operasi tetapi membuat subkulit , jadi saya tidak 100% yakin baris ini setara dengan baris sebelumnya:
((cd ~/screenshots/ && ls screenshot*) | head -n 5)
Lebih umum, bagaimana cara mengetahui AST dari bash line? Dalam python saya memiliki fungsi yang memberi saya pohon sehingga saya dapat dengan mudah memeriksa urutan operasi.
bash
menggunakan parser yacc bukan hal ad-hoc; jika Anda menjalankannya, yacc -v
itu akan memberi Anda y.output
tata bahasa yang bagus yang menunjukkan itu &&
dan ||
menggabungkan daftar, dan daftar pada akhirnya terdiri dari jaringan pipa (dan bukan sebaliknya); tl; dr; A && B | C
sama dengan A && { B | C; }
, seperti yang diharapkan. Jangan menganggap urutan eksekusi antara B
dan C
; perintah-perintah dalam sebuah pipa dijalankan secara paralel .
[...]
pengujian dan $((...))
evaluasi aritmatika; khususnya, ||
dan &&
seperti yang digunakan dengan daftar perintah dalam bahasa shell memiliki prioritas yang sama , tidak seperti masing-masing operator di C
atau dalam evaluasi aritmatika (di mana &&
mengikat lebih erat daripada ||
).
|
itu hanya konektor yang sesuai dengan stdout LHS ke stdin RHS. Jadi, jikacd
perintah dalam contoh Anda gagal, itu tidak akan mengirim output kehead
, tetapihead
pada kenyataannya akan tetapexecute
, mengurai apa-apa, dan mengembalikan tidak ada output.