Kabuk işlevi tanımı: neden açılış ayracı sonra boşluk var?


18

Muhtemelen o çatal bombayı biliyorsunuz :

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

Açılış kıvırcık ayraçtan sonra bir boşluk eklemenin neden ayrıştırılması gerektiğini merak ediyorum.

Yanıtlar:


13

{}

          { list; }

Kıvrık kaşlı ayraçlar arasına bir komut listesi yerleştirmek listenin geçerli kabuk bağlamında yürütülmesine neden olur. Alt kabuk oluşturulmaz. Aşağıdaki noktalı virgül (veya yeni satır) gerekir.

Bir alt kabuğun yaratılmasına ek olarak, bu iki yapı arasında tarihsel nedenlerden dolayı ince bir fark vardır. Diş telleri ayrılmış kelimelerdir, bu nedenle listeden boşluklar veya diğer kabuk metakarakterleri ile ayrılmalıdır. Parantezler işleçlerdir ve boşlukla listeden ayrılmasalar bile kabuk tarafından ayrı simgeler olarak tanınırlar.

// kaynak


1
Bu sayfadaki kendi yazımdaki cevabınızla tartıştım. Bu bir komut gruplaması değil bir işlevdir.
donothingsuccessfully

3
@donothingsuccessfully bir işlev gövdesi olan bir komut grubunu temsil eder.
Gilles 'SO- kötü olmayı bırak'

3

Bence @rush burada yanıltıcı bir cevap veriyorsa doğru olabilir. Çatal bomba, " " adlı bir işlevi tanımlar :. Kıvrık ayraçlardaki kod, işlev son " :" tarafından çağrılıncaya kadar yürütülmez . Yani komut grubu olarak kıvırcık parantez ve fonksiyon gövdesi olarak kıvırcık parantez sözdizimsel olarak aynıdır ancak farklı semantiğe sahiptir. @Rush cites ile
aynı belgeden :

Tarihsel nedenlerden dolayı, en yaygın kullanımda, işlevin gövdesini çevreleyen kıvırcık parantezlerin boşluklardan veya satırsonlarından vücuttan ayrılması gerektiğini unutmayın. Bunun nedeni, parantezlerin ayrılmış sözcükler olması ve yalnızca komut listesinden boşluk veya başka bir kabuk metakarakteriyle ayrıldıklarında tanınmalarıdır. Ayrıca, kaşlı ayraçları kullanırken, liste noktalı virgül, '&' veya yeni satır ile sonlandırılmalıdır.


3
Hayır, acele'nin cevabı doğrudur. Bir işlev gövdesi etrafındaki süslü parantezler, bir işlev gövdesi ile sınırlandırılmadığı zamanla aynı sözdizimsel öğedir. Kabuk dilbilgisi kurallarına bakın : a function_bodybir compound_command(artı isteğe bağlı redirect_list). Boşluk gereklidir, çünkü {özel bir karakter değil, ayrılmış bir kelimedir.
Gilles 'SO- kötü olmayı bırak

Evet, dediğim gibi acele'nin cevabı doğru. Evet, söylediğim gibi sözdizimsel olarak aynılar. Fakat brace_groupbir fonksiyonun parçası olduğunda ve olmadığında farklı davranırlar. İkinci durumu tanımlamak için komut gruplaması kullanıyordum ve acele bağlantısında açıklanan şey buydu.
donothingsuccessfully

2
Ayrıştırıcı için önemli olan sözdizimi olduğundan, anlamsal ayrımın burada önemli olduğundan emin değilim. Asıl cevap, {bir operatör değil, ayrılmış bir sözcüktür ve kelimelerin farklı kabul edilebilmesi için diğer kelimelerden ayrılması gerekir.
jw013
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.