Jalankan dua perintah dalam kasus || atau &&

11

Saya telah membaca tentang && dan || Dan saya ingin menjalankan dua perintah dalam kasus yang salah.

Saya sudah mencoba ;tetapi itu selalu berjalan . Saya telah mencoba memasukkannya ke kurung kurawal { command1; command2 }tetapi itu menghasilkan kesalahan sintaksis.

Saya ingin melakukan sesuatu seperti

command && echo "Ok, continuing" || echo "Check internet connection"; exit 1

yang hanya keluar jika tidak ada koneksi internet.

Thomas Weller
sumber
1
Ini sepertinya kesalahan tipografi sederhana. Pertanyaan yang jauh lebih menarik untuk diajukan adalah perbedaan antara ()dan {}.
edwinksl

Jawaban:

27

Menggunakan parens menempatkan perintah dalam subkulit yang tidak selalu seperti yang Anda inginkan. Atau, gunakan kurung kurawal:

command && echo "Ok, continuing" || { echo "Check internet connection"; exit 1; }

Kuncinya di sini adalah bahwa, tidak seperti parens, perintah terakhir dalam kawat gigi harus diikuti oleh ;.

Mengapa titik koma atau baris baru diperlukan

Kurung kurawal adalah argumen yang valid untuk suatu perintah. Sebagai contoh, berikut adalah kurung kurawal sebagai argumen untuk echo:

$ echo }
}

Akibatnya, jika shell melihat:

{ command1; command2 }

Shell menafsirkan command1 sebagai tidak memiliki argumen dan command2 memiliki satu argumen yang terdiri dari karakter }. Kurung kurawal }hanya diartikan sebagai penutupan grup jika mengikuti tanda titik koma atau baris baru. Untuk membuat pekerjaan di atas:

{ command1; command2; }

Subshell dan perbedaan antara {...}dan(...)

Perhatikan bahwa set berikut xke 10 tetapi pengaturan itu dilupakan sebelum echoperintah dijalankan:

$ x=0; false || ( echo Hello; x=10 )
Hello
$ echo $x
0

Sebaliknya, dengan kawat gigi keriting, pengaturannya x=10diingat:

$ x=0; false || { echo Hello; x=10; }
Hello
$ echo $x
10

Perbedaannya adalah karena tugas variabel dalam subkulit tidak bertahan setelah subkulit selesai.

Dokumentasi

Dari man bash:

(daftar)

daftar dieksekusi dalam lingkungan subkulit (lihat LINGKUNGAN PERINTAH EKSEKUSI di bawah). Tugas variabel dan perintah bawaan yang mempengaruhi lingkungan shell tidak tetap berlaku setelah perintah selesai. Status kembali adalah status keluar dari daftar.

{daftar; }

daftar hanya dieksekusi di lingkungan shell saat ini. daftar harus diakhiri dengan baris baru atau titik koma. Ini dikenal sebagai perintah grup. Status kembali adalah status keluar dari daftar. Perhatikan bahwa tidak seperti metacharacters (dan), {dan} adalah kata yang dilindungi undang-undang dan harus terjadi di mana kata yang dilindungi diizinkan untuk dikenali. Karena mereka tidak menyebabkan istirahat kata, mereka harus dipisahkan dari daftar oleh spasi putih atau karakter meta shell lainnya.

[Penekanan ditambahkan]

John1024
sumber