Saya telah menemukan bahwa pengaturan extglob
opsi shell di dalam senyawa majemuk menyebabkan kegagalan anti-gumpalan berikutnya. Apakah opsi shell harus diatur di luar perintah majemuk? Saya tidak melihat indikasi persyaratan seperti itu di halaman bash man.
Sebagai contoh, skrip berikut berfungsi dengan baik (cetak a.0 a.1
):
#!/bin/bash
touch a.0 a.1 \
a.b.0 a.b.1
shopt -s extglob
ls "a."!(b*)
Namun, jika dua baris terakhir dieksekusi sebagai perintah majemuk, skrip gagal dengan kesalahan berikut:
syntax error near unexpected token `('
` ls "a."!(b*)'
Ini diuji menggunakan versi bash dari 4.2 hingga 4.4 dan dengan berbagai perintah majemuk :
(1) bersyarat - if
#!/bin/bash
touch a.0 a.1 \
a.b.0 a.b.1
if true; then
shopt -s extglob
ls "a."!(b*)
fi
(2) kawat gigi - { }
#!/bin/bash
touch a.0 a.1 \
a.b.0 a.b.1
{
shopt -s extglob
ls "a."!(b*)
}
(3) subkulit - ( )
:
#!/bin/bash
touch a.0 a.1 \
a.b.0 a.b.1
(
shopt -s extglob
ls "a."!(b*)
)
Dalam semua kasus, jika shopt
dipindahkan di luar perintah majemuk, skrip berhasil.
C
atauperl
bisa melakukannya dengan baik. Perhatikan bahwa tidak menjadi bagian dari perintah majemuk tidak cukup,shopt -s extglob
juga harus berada di jalur terpisah. Lihat juga diskusi dan contoh di sini