Masalah itu sangat spesifik bash
, dan itu karena mereka memutuskan bash
untuk memisahkan ekspansi brace dari ekspansi nama file (globbing), dan untuk melakukannya terlebih dahulu, sebelum semua ekspansi lainnya.
Dari halaman bash
manual:
Urutan ekspansi adalah: ekspansi brace; ekspansi tilde, ekspansi parameter dan variabel, ekspansi aritmatika, dan penggantian perintah (dilakukan dengan cara kiri-ke-kanan); pemisahan kata; dan perluasan pathname.
Dalam contoh Anda, bash
hanya akan melihat kawat gigi Anda setelah melakukan penggantian perintah (yang $(echo ...)
), ketika sudah terlambat.
Ini berbeda dari semua shell lainnya, yang melakukan ekspansi brace tepat sebelum (dan beberapa bahkan sebagai bagian dari) ekspansi pathname (globbing). Itu termasuk tetapi tidak terbatas pada csh
tempat brace-ekspansi pertama kali ditemukan.
$ csh -c 'ls `echo "test{1,2}.txt"`'
test1.txt test2.txt
$ ksh -c 'ls $(echo "test{1,2}.txt")'
test1.txt test2.txt
$ var=nope var1=one var2=two bash -c 'echo $var{1,2}'
one two
$ var=nope var1=one var2=two csh -c 'echo $var{1,2}'
nope1 nope2
Contoh terakhir adalah di sama csh
, zsh
, ksh93
, mksh
atau fish
.
Juga, perhatikan bahwa penjepit ekspansi sebagai bagian dari globbing juga tersedia melalui glob(3)
fungsi pustaka (setidaknya di Linux dan semua BSD), dan dalam implementasi independen lainnya (misalnya dalam perl:) perl -le 'print join " ", <test{1,2}.txt>'
.
Mengapa hal itu dilakukan secara berbeda bash
mungkin memiliki cerita di baliknya, tetapi FWIW saya tidak dapat menemukan penjelasan logis, dan saya menemukan semua rasionalisasi post-hoc tidak meyakinkan.