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
}

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

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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.