TL; DR : POSIX destek grubunun neden {
ayrılmış sözcükten sonra boşluklara ihtiyacı var, ancak alt kabuk ayrılmış sözcükten sonra boşluk gerektirmiyor (
?
POSIX kabuk dilbilgisi küme grubu ve alt kabuğu aşağıdaki gibi tanımlar
brace_group : Lbrace compound_list Rbrace
subshell : '(' compound_list ')'
Şimdi, kelimenin tam anlamıyla okursak, boşluklar önemlidir. Bu, boşluk ayırıcı açma ve kapama ayracı ve parantezin olduğu gibi olması gerektiği anlamına gelir.
{ echo hello world; }
( echo hello world )
Bu ayrıca Bileşik Komut tanımlarıyla da uyumlu olacaktır :
Bu bileşik komutların her birinin başında ayrılmış bir sözcük ya da denetim işleci ve sonunda karşılık gelen bir sonlandırıcı ayrılmış sözcüğü ya da işleci vardır.
Bununla birlikte, mantıklı olmayan şey neden (list)
ve ( list )
iyi çalışıyor (bu boşluktan sonra (
gerekli değildir), ancak küme ayracı genişlemesinin önde gelen bir alana sahip olması gerekir, yani {echo hello;}
işe yaramaz.
Tabii ki kabuk kelime olarak muamele edilen ayrılmış kelime, daha sonra alan bölünmesi kavramına uyum sağlamak için bir boşluğa ihtiyaç duyulması anlamlıdır , ancak tanımın kendisi boşluklardan bahsetmez. Dahası, eğer {
ve (
onlar bu amaçlı sözcükler sonra boşluk karakteri açısından farklı muamele ediyoruz neden bileşik komuta POSIX tanımı, hem kabul saklıdır kelimelerdir? Şimdi, ksh (1) manuel şunları ifade eder:
Karakter dizisi olan kelimeler, sıralanmamış boşluk karakterleri (boşluk, sekme ve yeni satır) veya meta karakterler (<,>, |,;, &, (ve)) ile sınırlandırılır
Başka bir deyişle, ksh'ın (
ilk sözcüğün bir komut veya değişken ataması olacağı sözcük sınırlayıcı olarak tanıması mantıklıdır . Ancak POSIX, (
meta karakter olarak bahsedilmiyor . POSIX dilbilgisi ile ilgili olarak bulduğum tek olası açıklama {
, bir "jeton" olarak kabul edilir, burada bir olarak (
listelenmez.
/* These are reserved words, not operator tokens, and are
recognized when reserved words are recognized. */
%token Lbrace Rbrace Bang
/* '{' '}' '!' */
Peki bu tutarsızlığın kesin mantığı ne olurdu?
Kabul Edilen Cevap Notları:
Soruma doğrudan cevap veren standardın kendisinden q uote sağladığı için kabul edilen onay işaretini Isaac'in cevabına taşıdık :
Örneğin, '(' ve ')' kontrol işleçleridir, bu nedenle
<space>
(listede) gerekli değildir. Ancak, '{' ve '}' {list;} içindeki ayrılmış kelimelerdir, bu durumda öncü<space>
ve<semicolon>
gereklidir.Kusalananda'nın cevabını kabul etmek. Kusalananda'nın cevabı, çoğunlukla gayri resmi ve sezgisel açıdan ihtiyaç duyduğum şeye; işaret{
ayrılmış bir kelime ve(
operatör. Michael Homer ayrıca, Bileşik Komuta tanımının belirttiği (vurgu eklendi) yorumlarda da aynı şeyi kaydetti:Bu bileşik komutların her birinin başında ayrılmış bir sözcük veya denetim işleci vardır
{
Kabuk Dilbilgisine benzerfor
veyawhile
listelenen ayrılmış sözcük olarak tanımlanır (sorudaki son kod bloğuna bakın)Bölüm 2.9 şunları belirtir (vurgu eklenmiştir):
Özellikle gösterimler, s'nin gerekli olmayacağı bazı yerlerde jetonlar arasındaki boşluğu içerir (jetonlardan biri bir operatör olduğunda).
<blank>
Standart açıkça
(
bir operatör olarak tanımlanmamış olsa da, operatör(
olarak adlandırılır; özellikle, bölüm 2.9.2 diyorEğer boru hattı ayrılmış kelime ile başlıyorsa! ve komut1 bir alt kabuk komutudur, uygulama (komut1'in başındaki işleç! ile bir veya daha fazla karakter arasında ayrılmalıdır.
Dijital Travma ile Yığın Taşması Sorusu, Ayrılmış Kelimelerle ilgili Bölüm 2.4'e dikkat çekiyor:
Bu tanıma yalnızca karakterlerin hiçbiri alıntılanmadığında ve kelime şu şekilde kullanıldığında gerçekleşir:
-Komutun ilk kelimesi
Kusalananda'nın cevabında belirtildiği gibi "POSIX dilbilgisinde gösterilen boşluklar, kabuk girdi verilerinde bulunması gereken boşluklar değil, sadece dilbilgisinin kendisini göstermenin bir yoludur. Parantezlerin, boşluklarla çevrelenmeleri gerekiyor " Yorumlarda Michael Homer tarafından belirtildiği gibi :" Alanlar kendi başlarına önemli olsaydı, prodüksiyonda listelenmeleri gerekirdi "
Dava kapandı.
{
ve (
birleşik komutun POSIX hem olarak ayrılmış kelimeler" karş "Bu bileşik komutların her birinin başında ayrılmış bir sözcük ya da kontrol operatörü var ".
' '
) içermesi gerektiği anlamına geldiğine inanıyorum . Bunun yerine, boşluklar hangi tokenlerin kelimeler olduğu anlamına gelir.
command : simple_command | compound_command | compound_command redirect_list | function_definition ;
bir komuta sahip olabileceğinizi söyleyen bir prodüksiyon, basit bir komut, birleşik komut veya yeniden yönlendirmeli bir bileşik komut veya bir fonksiyon tanımı olabilir.