Di mana kelanjutan garis bash setelah && dan || didokumentasikan?

28

Saya telah melihat konstruksi ini dalam skrip banyak dan menggunakannya sendiri, tetapi saya merasa terganggu karena saya tidak dapat menemukannya dalam dokumentasi.

Contoh:

[ -f file1 ] &&
[ -f file2 ] &&
echo "Both files exist." ||
echo "One or the other file doesn't exist."

Ini juga bisa dilakukan dengan garis miring terbalik sebelum baris baru, sebagaimana disebutkan dalam man bash:

If a \<newline> pair appears,  and  the  backslash  is  not
itself  quoted,  the \<newline> is treated as a line continuation (that
is, it is removed from the input stream and effectively ignored).

Contoh:

[ -f file1 ] && \
[ -f file2 ] && \
echo "Both files exist." || \
echo "One or the other file doesn't exist."

... tapi ini sepertinya tidak perlu. Versi pertama di atas berfungsi bahkan tanpa garis miring terbalik.

Di mana saya dapat menemukan ini man bash? (Juga, apakah ini bashkhusus atau POSIX?)

Wildcard
sumber
Jika Anda mencari bash resmi atau dokumentasi POSIX, lihat jawaban Gilles. Tapi ini dibahas di Apa kontrol shell dan operator redirection? - observasi lebih lanjut tentang ;, &, (dan) .
G-Man Mengatakan 'Reinstate Monica'
@ G-Man, kurasa itu tidak ditujukan padaku? Hanya untuk pembaca masa depan? Seperti yang saya katakan dalam pertanyaan, "saya merasa terganggu karena saya tidak dapat menemukannya di dokumentasi." Saya sudah tahu cara kerjanya, jadi ini memang hanya permintaan untuk dokumentasi resmi. :)
Wildcard
Bahkan dalam kasus array, ada garis kelanjutan implisit: names=( Rama Soma<newline> Sita Diya ). Python jelas menggambarkan ini di sini tetapi dokumentasi Bash sepertinya tidak.
jamadagni

Jawaban:

39

Baris baru diabaikan dalam beberapa konteks di mana secara nyata ada perintah yang tidak ditentukan. Konteks ini termasuk setelah operator control ( &&, ||, |, &, ;, ;;, tapi tidak !).

Saya tidak melihat ini didokumentasikan dalam manual bash.

Di POSIX, itu ditentukan melalui aturan tata bahasa . Di mana pun aturan memiliki linebreak, Anda dapat memiliki nol atau lebih jeda baris.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
+1, saya tidak tahu itu berfungsi untuk pipa sederhana (|). Saya berharap kita juga bisa menempatkan mereka di baris berikutnya, agar mudah dibaca, tetapi tidak berfungsi seperti itu (jika melakukan itu, Anda perlu menambahkan baris sebelumnya).
Olivier Dulac
1
@OlivierDulac Bagaimana itu bisa bekerja? Saat memproses baris perintah saat ini, bagaimana seharusnya tahu bahwa Anda berencana mengetik |di awal baris berikutnya? Ingat, shell juga digunakan secara interaktif, tidak hanya dalam skrip, dan tata bahasanya sama.
Barmar
@Barmar: Saya tahu, saya tahu ini (menulis kompiler di sekolah ^^) ... Saya berkata "Saya berharap", dan itu bukan keinginan yang sangat masuk akal
Olivier Dulac
1
@ DocSalvager, dapatkah Anda memberikan contoh bug logika yang akan membantu mencegah? Saya kesulitan melihatnya ....
Wildcard
2
@ DocSalvager, saya tidak akan benar-benar menggunakan kode ketika saya menulisnya — itu adalah ilustrasi. Tanpa baris terakhir (klausa lain) saya akan menggunakannya dengan cara itu. (Untuk "jika ini dan ini maka lakukan itu" this && this2 && thatbaik-baik saja tetapi untuk elseklausa saya akan menggunakan yang sebenarnya if then else fi.)
Wildcard