Apa perbedaan antara a[bc]d
dan a{b,c}d
? Mengapa orang menggunakan a{b,c}d
ketika sudah ada a[bc]d
?
brace-expansion
pattern-matching
Weijun Zhou
sumber
sumber
command a[bc]d
?ls
dan Anda hanya pernah mencoba karakter tunggal, mereka akan tampak bekerja sama.Jawaban:
Keduanya sangat berbeda.
a[bc]d
adalah pola nama file (dalam cangkang selainfish
). Ini akan diperluas ke dua nama fileabd
danacd
jika itu adalah nama file yang ada di direktori saat ini.Bagian
[...]
ini adalah ekspresi kurung yang cocok dengan satu karakter dari yang tercantum (atau menyusun elemen ketika rentang disertakan). Untuk mencocokkan polaa[bc]d
, karakter antara stringa
dand
nama file harus berupa ab
atau ac
.Jika
abd
ada, tetapiacd
tidak, maka itu hanya akan berkembang menjadiabd
, dan sebaliknya.Jika tidak
abd
, atauacd
ada, tergantung pada shell dan pilihan, itu akan memicu kesalahan (asli Unixsh
,(t)csh
,zsh
,fish
,bash -O failglob
) dan mungkin keluar dari shell, atau meninggalkan unexpanded¹ pola (Bourne-seperti danrc
-seperti kerang) atau memperluas ke tidak ada (bash/zsh/yash -o nullglob
, beberapa versi lamafish
, Unix aslish
dan(t)csh
jika ada gumpalan lain yang cocok dalam perintah yang sama).a{b,c}d
adalah ekspansi brace (di shell yang mendukung ini). Ini akan berkembang ke dua stringabd
danacd
.Bagian tersebut
{...}
adalah serangkaian string yang dibatasi koma (dalam contoh ini; dalam beberapa shell, itu juga dapat berupa rentang sepertia..k
atau20..25
atau yang lebih maju seperti00..20..2
atau0..20..2%02d
), dan ekspansi dihitung dengan menggabungkan masing-masing string ini dengan sisi-sisi. stringa
dand
. String ini bisa lebih panjang dari satu karakter dan juga bisa menjadi penjepit ekspansi sendiri.Ekspansi terjadi terlepas dari apakah string ini sesuai dengan nama file yang ada atau tidak.
Jika Anda membuat string, gunakan ekspansi brace. Jika Anda mencocokkan nama file, gunakan pola nama file.
¹ Dalam kasus khusus ini,
a[bc]d
bisa jadi itu adalah nama dari file yang sudah ada yang karenanya berpotensi berbahaya untuk menggunakan hal-hal sepertirm -f ./*.[ch]
di shell itu danrm -f ./*.{c,h}
tidak terlalu menjadi masalah.sumber
a{b,c}d
, bagianb
danc
tidak perlu menjadi huruf tunggal; misex{ten,ci}sion
. Sementaraex[tenci]sion
atau apa pun hanya akan cocok dengan salah satu dari surat-surat ini.a[bc]d
adalah pencocokan pola , dan merupakan bagian dari standar POSIX. Dalam POSIX, ini diperkenalkan sebagai "ekspresi braket pola". Itu didokumentasikan dalam bagian 2.13 manualBagian 2.13.3 juga menyebutkan sesuatu yang berperilaku berbeda dari apa yang diharapkan seseorang untuk regex biasa ketika digunakan untuk ekspansi nama file (penekanan oleh saya)
a{b,c}d
adalah perluasan kawat gigi , tidak dalam spesifikasi oleh POSIX. Inilah bagian yang sesuai dari manual bash (penekanan oleh saya):Menurut komentar oleh @mosvy, ini pertama kali muncul dari
csh
tetapi perilaku dibash
berbeda daricsh
dan kerang lainnya. Jenis ekspansi kawat gigi juga hadir diglob(3)
.Ada jenis lain dari ekspansi kawat gigi
{a..z}
yang hanya muncul setelahbash
3.0, dan ada lebih banyak ditambahkan dibash
4.0.Dalam shell di mana globbing dihidupkan, jalankan di folder kosong, hasil berikut dikembalikan
Menanggapi komentar @ Jesse_b, jika Anda berada di shell interaktif dan keduanya berlaku,
a[bc]d
lebih sedikit kesulitan mengetik. Sebagai contohgrep pattern [ab][12].txt
.sumber
csh
, jauh sebelumnyabash
. Ini juga hadir dalam fungsi perpustakaan glob (3). Perbedaannya adalah bahwabash
hal itu dilakukan sebelum ekspansi lain:a=A; ab=A/B; ac=A/C; echo $a{b,c}
akan bekerja di bash berbeda dari shell lain.