`]` Nin belirteç tanımlayıcısı nedir?


9

Bash Manual diyor:

[Form kullanıldığında, komutun son argümanı a] olmalıdır.

$ type [
[ is a shell builtin
$ type ]
bash: type: ]: not found

Yani ]ayrılmış bir kelime değildir, ne de bir operatör, ne de bir yerleşik komuttur.

Bir belirteç olarak, belirteç tanımlayıcısı ]nedir? WORD veya NAME?


4
Aslında, [(aynı zamanda) kendi kendini sürdürebilen bir komuttur: -rwxr-xr-x 1 kök kök 39552 Aralık 3 18:14 / usr / bin / [Mümkün olsa da, yerleşik "paralel" örneğin kill. Bazı sistemlerde, testkomut sembolik bir bağlantıdır [veya bunun tersi de geçerlidir. AFAIK, ]tek başına bir şey ifade etmiyor, ancak a'yı "kapatmak" olarak kabul ediliyor [- ama daha çok "estetik" bir sebep için.
— Baard Kopperud

5
Kabuk dili son 46 yılda katman katman büyüdü ve iç tutarlılık asla bir öncelik değildi. Eğer onu herhangi bir teorik biçimsel dil çerçevesine zorlamaya çalışırsanız, kötü zaman geçireceksiniz.
— zwol

Yana [bir kendine yeten komutu (ayrıca) 'dir, genellikle Yani deneyin ... Bir insan sayfasını var man [ve / veya man test( [ve testaynı komut olabilir).
— Baard Kopperud

]Tek veya çift tırnak içine yapışmayı deneyin ve fark etmez göreceksiniz; sadece bir ip.
— Wildcard

Yanıtlar:


21

]tamamlar [, [komuta kapanış işaretidir .

manSayfanın işaret ettiği gibi , bu aslında bir argüman [, ancak [özellikle son olarak ele alıyor.

Örneğin, diğer bazı komut kapanış desenleri ile benzetilebilir ;içinde find .. exec.


Teşekkürler. Jeton türü / tanımlayıcısı ]nedir?
— Tim

8
@Tim ], bu bağlamdaki diğer normal karakterlerden farklı değildir (bir komuta argüman olarak). testKomut davranır özel olarak o, ama bu komutla kalmış.
— muru

6
Bu sadece bir dize ve [son argümanı tam olarak eşit değilse bir hata oluşturur ].
— chepner

19

Bash , alfabedeki bir harften farklı olarak [veya ]karakterlerine (kendi başlarına) davranmaz .

Bu durumda bash bir "kelime" görür [ve bu ada sahip bir komut arar. Dosya sisteminize bakarsanız, muhtemelen /bin/[(veya /usr/bin/[) yürütülebilir bir dosya olarak var olduğunu göreceksiniz . Olduğu gibi, bash ayrıca yerleşik bir versiyon sağlar (verimlilik uğruna), ancak bu sadece bir uygulama detayıdır.

[(Olduğu gibi bu adla yürütülebilir) komutu, kendisine iletmek son parametre olması gerektiğini bir kuralı vardır ]ya da başka bir hata atar. Bu kısmen estetik açıdan hoş olduğu için olabilir, ancak sizi yanlışlıkla kesilmiş komutlardan korumaya da hizmet eder, bu da güzel.

Bunların özel olmaması, [veya öncesinde beyaz alanı neden atlayamamanızdır ].


İstisnalar :

  • Ne zaman [ve ]aynı kelime içerisinde doğru biçimde ortaya, örneğin [a-z], o ise özel ve bash en globbing kurallar geçerlidir.
  • [[Komut olan özel ve birçok şeyi yapabilir [(ve parametreler içeride olamaz [[ .. ]]gibi bazı satır sonları vardır, farklı işlenir). Buna karşılık gelen ]], komut adı olamayan ve [[anahtar sözcüğü izleyen özel işlemi sonlandırdığı için kabuk ayrılmış bir sözcük olduğundan da özeldir .

1
@JacobKrall Bu gibi özel bir karakter değil ;ya >sadece yerleşik bir komutu gibi, cd. Özellikle, yazarsanız [x, [özel bir anlamı yoktur.
— Barmar

2
@JacobKrall Bu, tüm yerleşik komutlar için geçerlidir. [özel bir komuttur , özel bir karakter değildir .
— Barmar

@Barmar: Yeterince adil; Yorumlarımı geri çekiyorum.
— Jacob Krall

Aslında ]]daha özel ]. Kullanırken [ve ]sadece kelimelerdir. Bunu atladıysanız ]veya başka bir kelimeyle değiştirdiyseniz, bash yine de çalışır [, ancak [bir hata oluşturur. Ancak [[ve ]]zamanı ayrıştırma özel davranılır. Başka ]]bir şeyle değiştirdiyseniz , bash bir sözdizimi hatası bildirir. Ve ]]bash atladıysanız, sonraki satırı ayrıştırmaya devam edecektir ]].
— kasperd

@kasperd cevap ayarlandı.
— ams

3

Önceki iki cevaptan daha basit bir şekilde ifade etmek gerekirse ], sadece [çalışması gereken bir dizedir .


1
Bu biraz bir yorum gibi görünüyor ...
— wizzwizz4 16:16

@ wizzwizz4, yorumlarda OP takip soruları göz önüne alındığında, bu basitlik tam olarak ne ihtiyaç olduğunu düşünüyorum.
— Wildcard

@Wildcard Aslında katılıyorum. Bu cevabı iptal etmem için cazip bir şey vardı, ama bunun düşük kalite olduğunu düşündüm. (Gerçi oy vermedim!) İşaretlemeyi geliştirmek için düzenleme yapacağım.
— wizzwizz4
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.