Pertimbangkan perintahnya
eval false || echo ok
echo also ok
Biasanya, kami mengharapkan ini untuk mengeksekusi falseutilitas dan, karena status keluar tidak nol, untuk kemudian jalankan echo okdan echo also ok.
Dalam semua POSIX-seperti kerang saya gunakan ( ksh93, zsh, bash, dash, OpenBSD ksh, dan yash), ini adalah apa yang terjadi, tetapi hal-hal menarik jika kita aktifkan set -e.
Jika set -eberlaku, OpenBSD's shdan kshshells (keduanya berasal dari pdksh) akan mengakhiri skrip saat menjalankan eval. Tidak ada shell lain yang melakukan itu.
POSIX mengatakan bahwa kesalahan dalam utilitas built-in khusus (seperti eval) harus menyebabkan shell non-interaktif berakhir. Saya tidak sepenuhnya yakin apakah mengeksekusi falsemerupakan "kesalahan" (jika ya, itu akan terlepas dari set -eaktif).
Cara untuk mengatasi ini tampaknya adalah dengan meletakkan evaldi sub shell,
( eval false ) || echo ok
echo also ok
Pertanyaannya adalah apakah saya harus melakukan itu di skrip shell POSIX-ly yang benar, atau apakah itu bug di shell OpenBSD? Juga, apa yang dimaksud dengan "kesalahan" dalam teks POSIX yang ditautkan ke atas?
Info ekstra: Kerang OpenBSD akan menjalankan perintah echo okdengan dan tanpa set -e di perintah
eval ! true || echo ok
Kode asli saya terlihat seperti
set -e
if eval "$string"; then
echo ok
else
echo not ok
fi
yang tidak akan menghasilkan not okdengan string=falsemenggunakan kerang OpenBSD (itu akan berakhir), dan saya tidak yakin itu karena desain, kesalahan atau kesalahpahaman, atau sesuatu yang lain.
eval falseuntuk menghentikan skrip walaupun itu bagian dari daftar AND-OR atau pernyataan kondisional? Saya tidak akan.
set -ediatur jika itu adalah perilaku yang benar ... Saya setuju bahwa masuk akal untuk tidak mengakhiri dalam pernyataan bersyarat.
set -esehingga `()` adalah jawabannya.
eval falsemenghasilkan status non-nol jadi saya berharapset -euntuk mengakhiri skrip pada saat itu. Dalam hal!set -etidak berlaku sebagai!pernyataan secara eksplisit memeriksa status keluar.