Apakah mungkin untuk memeriksa apakah -e diatur dalam skrip bash?

9

Jika fungsi shell memerlukan pengaturan spesifik -e / + e agar dapat bekerja, apakah mungkin untuk mengatur pengaturan itu secara lokal dan kemudian mengembalikannya ke pengaturan sebelumnya sebelum keluar dari fungsi?

myfunction()
{
   # Query here if -e is set and remember in a variable?
   # Or push the settings to then pop at the end of the function?
   set +e
   dosomething
   doanotherthing
   # Restore -e/+e as appropriate, don't just do unconditional   set -e
}
usta
sumber

Jawaban:

12

Anda memiliki flag yang saat ini diatur dalam variabel $-, sehingga Anda dapat mempertahankan ini pada awal fungsi dan mengembalikannya setelah itu.

save=$-
...
if [[ $save =~ e ]]
then set -e
else set +e
fi
meuh
sumber
Perlu dicatat bahwa ini $-juga berfungsi /bin/shdan Anda mungkin tidak perlu bashism untuk menguraikannya, cukup gunakan misalnya globbing yang casemenyediakan
Josip Rodin
2

Anda dapat membaca nilai bendera melalui variabel SHELLOPTS:

  > set +e 
  > echo $SHELLOPTS
    braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
  > set -e 
  > echo $SHELLOPTS
    braceexpand:emacs:errexit:hashall:histexpand:history:interactive-comments:monitor

Anda melihat bahwa, setelah pengaturan set -e, nilai errexitdalam $SHELLOPTSmuncul. Anda dapat memeriksanya dari sana.

Namun, Anda dapat menyiasatinya (jika mau!) Dengan mengingat poin berikut: menurut Manual :

-e :

..... Pilihan ini berlaku untuk lingkungan shell dan masing-masing lingkungan subkulit secara terpisah.

Jadi, jika Anda menjalankan fungsi Anda dalam sebuah subkulit, seperti

   zz="$(myfunction)"

Anda tidak perlu khawatir apakah errexitvariabelnya diatur atau tidak dalam lingkungan panggilan, dan Anda dapat mengaturnya sesuka Anda.

MariusMatutiae
sumber
Terima kasih, SHELLOPTS bermanfaat untuk diperhatikan. Saya menemukan $ - disarankan oleh @ saya lebih mudah untuk memeriksa secara terprogram, itu sebabnya saya menerima jawaban itu.
usta
Catatan tentang subkulit juga bermanfaat, tetapi saya ingin menghindari memodifikasi situs panggilan. Kalau tidak, saya mungkin akan mengubah myfunctionpanggilan untuk myfunction || truemenekan efek -e untuk panggilan dan tidak harus melakukan set +edi dalam fungsi di tempat pertama.
usta
@MariusMatutiae: 20000 selamat.
Scott