Beberapa bulan yang lalu saya menato bom garpu di lengan saya, dan saya melewatkan ruang putih, karena saya pikir itu terlihat lebih baik tanpa mereka. Tetapi saya kaget, kadang-kadang (tidak selalu) ketika saya menjalankannya di shell, ia tidak memulai bom fork, tetapi itu hanya memberikan kesalahan sintaksis.
bash: syntax error near unexpected token `{:'
Kemarin itu terjadi ketika saya mencoba menjalankannya di shell Bash teman , dan kemudian saya menambahkan spasi putih dan tiba-tiba bekerja, :(){ :|:& };:
bukannya:(){:|:&};:
Apakah masalah spasi putih; sudahkah saya menato kesalahan sintaksis di lengan saya ?!
Tampaknya selalu bekerja di zsh , tetapi tidak di Bash.
Pertanyaan terkait tidak menjelaskan apa pun tentang ruang putih, yang sebenarnya adalah pertanyaan saya; Mengapa ruang putih diperlukan untuk Bash agar dapat menguraikannya dengan benar?
sumber
Jawaban:
Ada daftar karakter yang memisahkan token di BASH. Karakter ini disebut metakarakter dan mereka
|
,&
,;
,(
,)
,<
,>
, ruang dan tab . Di sisi lain, kurung kurawal ({
dan}
) hanyalah karakter biasa yang membentuk kata-kata.Menghilangkan ruang kedua sebelumnya
}
akan dilakukan, karena&
merupakan metacharacter. Karena itu, tato Anda harus memiliki setidaknya satu karakter spasi.sumber
on the other hand
... pun intended? ;): D (Maaf, karena komentar topik).{
dan}
adalah kata kunci shell dalam konteks ini. Hanya jika mereka tidak dikenali seperti itu - karena kurangnya ruang / metakarakter di sekitarnya - mereka diperlakukan sebagai bagian harfiah dari kata mereka menjadi bagian dari. (Dan kemudian ada ekspansi penjepit, yang terjadi dalam konteks yang berbeda.){foo} () { echo hello; }
"Nama", sebagaimana didefinisikan olehbash
sebagai "kata yang hanya terdiri dari karakter alfanumerik dan garis bawah, dan dimulai dengan karakter alfabet atau garis bawah", hanya berlaku untuk nama variabel.Hanya tato a
Shebang di atasnya dan Anda akan baik-baik saja.
sumber
Kawat gigi lebih seperti kata kunci aneh daripada simbol khusus, dan memang perlu spasi. Ini berbeda dengan tanda kurung, misalnya. Membandingkan:
yang bekerja, dan:
yang mencari perintah bernama
{ls}
. Untuk bekerja, itu harus:Tanda titik koma menghentikan kurung kurawal yang diambil sebagai parameter
ls
.Yang harus Anda lakukan adalah memberi tahu orang-orang bahwa Anda menggunakan font proporsional dengan karakter spasi yang agak sempit.
sumber
ls
.Meskipun tidak mudah terlihat di font tatoo, sebenarnya ada Byte-Order Mark (BOM) antara penjepit dan titik dua (Anda mungkin sudah cukup mabuk ketika Anda mendapat tatoo yang tidak Anda perhatikan, tetapi itu benar-benar ada) . Ini menyisakan tiga kemungkinan yang jelas:
sumber
Itu karena bagaimana shell mengurai. Anda memerlukan spasi setelah definisi fungsi dimulai, yaitu setelah
{
.valid Di samping itu,
bukan.
Anda sebenarnya membutuhkan tato seperti ini:
Dari sumber :
Menghilangkan spasi setelah
{
menyebabkan{echo
ditafsirkan sebagai token tunggal.Bentuk setara dengan
akan menjadi
Perhatikan bahwa tidak ada ruang setelah
{
dalam versi alternatif, tetapi satu baris menyebabkan shell untuk mengenali{
sebagai token.sumber
{echo
sebelum mencapai brace pembuka yang diperlukan?