Definisi fungsi Shell: mengapa ada ruang setelah brace pembuka?


18

Anda mungkin tahu bom fork itu :

 :(){ :|:&};: #WARNING: harmful code

Saya bertanya-tanya mengapa itu perlu, agar dapat diurai, untuk memasukkan ruang setelah kurung kurawal pembukaan.

Jawaban:


13

{}

          { list; }

Menempatkan daftar perintah antara kurung kurawal menyebabkan daftar dieksekusi dalam konteks shell saat ini. Tidak ada subkulit yang dibuat. Tanda titik koma (atau baris baru) diperlukan.

Selain penciptaan subkulit, ada perbedaan halus antara kedua konstruksi ini karena alasan historis. Kawat gigi adalah kata-kata yang dicadangkan, sehingga harus dipisahkan dari daftar dengan karakter meta kosong atau karakter shell lainnya. Tanda kurung adalah operator, dan diakui sebagai token terpisah oleh shell meskipun mereka tidak dipisahkan dari daftar oleh spasi putih.

// sumber


1
Saya telah kebawelan dengan jawaban Anda di pos saya sendiri di halaman ini. Ini adalah fungsi bukan pengelompokan perintah.
Donasi berhasil pada

3
@tidak berhasil, badan fungsi adalah pengelompokan perintah.
Gilles 'SO- stop being evil'

3

Saya pikir @rush mungkin memberikan jawaban yang benar jika menyesatkan di sini. Garpu-bom mendefinisikan fungsi yang disebut " :". Kode dalam kurung kurawal tidak dieksekusi sampai fungsi dipanggil oleh " :" final . Jadi kurung kurawal sebagai pengelompokan perintah dan kurung kurawal sebagai fungsi tubuh secara sintaksis sama tetapi memiliki semantik yang berbeda.
Dari dokumen yang sama dengan @rush mengutip:

Perhatikan bahwa karena alasan historis, dalam penggunaan yang paling umum kurung kurawal yang mengelilingi tubuh fungsi harus dipisahkan dari tubuh dengan kosong atau baris baru. Ini karena kurung kurawal adalah kata yang dilindungi undang-undang dan hanya dikenali seperti itu ketika dipisahkan dari daftar perintah oleh whitespace atau metacharacter shell lainnya. Juga, ketika menggunakan kawat gigi, daftar harus diakhiri dengan tanda titik koma, '&', atau baris baru.


3
Tidak, jawaban terburu-buru benar. Kurung kurawal di sekitar fungsi tubuh adalah elemen sintaksis yang sama seperti ketika mereka tidak dibatasi fungsi tubuh. Lihat aturan tata bahasa shell : a function_bodyadalah compound_command(ditambah opsional redirect_list). Ruang diperlukan karena {merupakan kata khusus, bukan karakter khusus.
Gilles 'SO- stop being evil'

Ya, jawaban terburu-buru benar, seperti yang saya katakan. Ya, secara sintaksis sama, seperti yang saya katakan. Tapi brace_groups berperilaku berbeda ketika bagian dari suatu fungsi dan kapan tidak. Saya menggunakan pengelompokan perintah untuk menggambarkan kasus terakhir dan ini adalah apa yang dijelaskan dalam tautan terburu-buru.
Donasi berhasil

2
Saya tidak yakin perbedaan semantik signifikan di sini, karena sintaksilah yang penting bagi pengurai. Jawaban sebenarnya {bukanlah operator tetapi kata yang dilindungi undang-undang, dan kata-kata harus dipisahkan dari kata lain agar dianggap berbeda.
jw013
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.