Apa pengenal token dari `]`?

9

Bash Manual mengatakan:

Ketika [form digunakan, argumen terakhir ke perintah harus a].

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

Jadi ]bukan kata yang dipesan, juga bukan operator, juga bukan perintah bawaan.

Sebagai token, apa pengenal token ]? KATA atau NAMA?

Tim
sumber
4
Sebenarnya, [adalah (juga) perintah mandiri: -rwxr-xr-x 1 root 39552 3 Des 18:14 / usr / bin / [Meskipun mungkin ada juga built-in "paralel", seperti ada untuk misalnya kill. Pada beberapa sistem, testperintahnya adalah tautan simbolis ke [atau sebaliknya. AFAIK, ]tidak berarti apa-apa dengan sendirinya, tetapi diterima untuk "menutup" a [- tetapi lebih karena alasan "estetika".
Baard Kopperud
5
Bahasa shell telah berkembang lapis demi lapis selama 46 tahun terakhir, dan konsistensi internal tidak pernah menjadi prioritas. Jika Anda mencoba memasukkannya ke dalam kerangka teori formal-bahasa apa pun, Anda akan mengalami kesulitan.
zwol
Karena [(juga) perintah mandiri, biasanya mendapat halaman manual ... Jadi coba man [dan / atau man test( [dan testmungkin perintah yang sama).
Baard Kopperud
Coba tempel ]dalam tanda kutip tunggal atau ganda dan Anda akan melihatnya tidak ada bedanya; itu hanya sebuah string.
Wildcard

Jawaban:

21

]komplemen [, itu adalah tanda penutup [perintah.

Seperti yang manditunjukkan oleh halaman, ini sebenarnya adalah argumen untuk [, tetapi [kebetulan memperlakukannya terutama, sebagai akhir.

Anda dapat menyerupai itu dengan beberapa pola penutupan perintah lainnya, misalnya ;dalam find .. exec.

heemayl
sumber
Terima kasih. Apa jenis / pengenal token ]?
Tim
8
@Tim ]tidak berbeda dari karakter normal lainnya dalam konteks ini (sebagai argumen ke perintah). The testperintah memperlakukan itu khusus, tapi itu terserah perintah.
muru
6
Itu hanya sebuah string, dan [memunculkan kesalahan jika argumen terakhirnya tidak persis sama dengan ].
chepner
19

Bash tidak memperlakukan [atau ]karakter (sendiri) berbeda dari huruf alfabet.

Dalam hal ini bash melihat "kata" [,, dan pergi mencari perintah dengan nama itu. Jika Anda melihat di sistem file Anda, Anda mungkin akan menemukan /bin/[(atau /usr/bin/[) ada sebagai file yang dapat dieksekusi. Seperti yang terjadi, bash juga menyediakan versi bawaan (demi efisiensi), tapi itu hanya detail implementasi.

The [perintah (seperti dalam, dieksekusi dengan nama itu), memiliki aturan bahwa parameter terakhir yang Anda lulus untuk itu harus ]atau yang lain itu melempar kesalahan. Ini mungkin sebagian karena itu menyenangkan secara estetika, tetapi juga berfungsi untuk melindungi Anda dari perintah yang terpotong secara tidak sengaja, yang bagus.

Fakta bahwa ini tidak istimewa adalah mengapa Anda tidak bisa menghilangkan ruang putih sebelum dan sesudah [atau ].


Pengecualian :

  • Ketika [dan ]terjadi dalam format yang benar dalam kata yang sama, misalnya [a-z], maka itu adalah khusus dan aturan globbing bash berlaku.
  • The [[perintah adalah khusus dan dapat melakukan banyak hal [tidak dapat (dan parameter dalam [[ .. ]]diproses secara berbeda, seperti juga beberapa jeda baris). Yang bersesuaian ]]juga istimewa, karena merupakan kata yang dilindungi undang-undang yang tidak boleh berupa nama perintah, dan mengakhiri pemrosesan khusus yang mengikuti [[kata kunci.
am
sumber
1
@ JacobKrall Ini bukan karakter khusus seperti ;atau >, itu hanya perintah bawaan seperti cd. Secara khusus, jika Anda mengetik [x, [tidak memiliki arti khusus.
Barmar
2
@ JacobKrall Itu berlaku untuk semua perintah bawaan. [adalah perintah khusus , itu bukan karakter khusus .
Barmar
@Barmar: Cukup adil; Saya menarik komentar saya.
Jacob Krall
Sebenarnya ]]lebih istimewa daripada ]. Saat menggunakan [dan ]itu hanya kata-kata. Jika Anda menghapus ]atau menggantinya dengan kata lain, bash akan tetap berjalan [, tetapi [akan menghasilkan kesalahan. Namun [[dan ]]diperlakukan istimewa pada waktu penguraian. Jika Anda diganti ]]dengan yang lain, bash akan melaporkan kesalahan sintaksis. Dan jika Anda menghapus ]]bash akan tetap menguraikan baris berikutnya mencari ]].
kasperd
@kasperd jawaban disesuaikan.
ams
3

Untuk membuatnya lebih sederhana dari dua jawaban sebelumnya, ]hanyalah sebuah string yang [harus dijalankan.

Kenny
sumber
1
Ini agak mirip komentar ...
wizzwizz4
@ wizzwizz4, mengingat pertanyaan tindak lanjut dari OP di komentar, saya pikir kesederhanaan ini persis apa yang dia butuhkan.
Wildcard
@ Kartu Memori Saya benar-benar setuju. Ada sesuatu yang menggoda saya untuk mengangkat jawaban ini, tetapi saya pikir itu berkualitas rendah. (Meskipun tidak downvote!) Saya akan mengedit untuk meningkatkan markup.
wizzwizz4