Bash: `-su: $ *: variabel tidak terikat` dengan` set -u`

8

Ini adalah sistem FreeBSD 7.x yang menjalankan GNU bash versi 4.0.

Di Bash, set -uopsi dapat memaksa shell untuk mencetak kesalahan jika menemui variabel yang tidak disetel, seperti ini:

$ set -u
$ echo $THISISUNSET
-su: THISISUNSET: unbound variable
$ echo $?
1

Namun, saya juga menghadapi kesalahan yang sama ini untuk $ *:

$ echo $*
-su: $*: unbound variable
$ echo $?
1
$ echo $@
-su: $@: unbound variable

The Bash Manual 4.3.1 Set Builtin secara khusus mengatakan bahwa set -umengabaikan $ * dan $ @:

-u Perlakukan variabel dan parameter yang tidak disetel selain dari parameter khusus '@' atau '*' sebagai kesalahan saat melakukan ekspansi parameter. Pesan kesalahan akan ditulis ke kesalahan standar, dan shell non-interaktif akan keluar.

Bagaimana saya bisa memperbaikinya?

Stefan Lasiewski
sumber

Jawaban:

11

Ini adalah bug dalam versi bash yang lebih lama, khususnya 4.0 β2 patchlevel d hingga 4.0 patchlevel m. Dari changelog dari 4,0 hingga 4,1 α:

n. Memperbaiki perilaku set -uagar sesuai dengan interpretasi Posix terbaru: setiap perluasan variabel yang tidak disetel kecuali $ @ dan $ * akan menyebabkan shell keluar.

Perilaku ini diperkenalkan di 4.0β2 karena perilaku sebelumnya (dan sekarang lagi sekarang) dianggap bermasalah:

d. Memperbaiki bug yang menyebabkan ekspansi $ @ dan $ * tidak keluar dari shell jika opsi -u diaktifkan dan tidak ada parameter posisional.

Gilles 'SANGAT berhenti menjadi jahat'
sumber