`]` 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.