Saya sedang menulis skrip yang perlu dieksekusi menggunakan source
, karena tugasnya adalah memodifikasi lingkungan. Selama skrip, saya ingin menggunakan set -e
sehingga kesalahan apa pun menghentikan skrip. Scriptnya terlihat seperti ini:
#!/bin/bash
set -e
# do something
cd somewhere
source anotherScript
Masalahnya adalah bahwa set -e
secara alami tetap berlaku setelah skrip selesai. Bagaimana saya bisa memastikan bahwa set
opsi yang diubah dikembalikan dengan benar ke nilainya ketika skrip berhenti (dengan cara apa pun - baik dengan menyelesaikan dengan sukses atau pada kesalahan)?
bash
script
bash-scripting
Petr Pudlák
sumber
sumber
-x
/xtrace
) dialamatkan pada jejak eksekusi Suppress untuk perintah gema?Jawaban:
Persis seperti cara Anda mengaktifkannya: memanggil buitin
set
:Dari
bash(1)
manual, di bawahSHELL BUILTIN COMMANDS
bagian, perintah `set ':sumber
set -o
untuk mengetahui pengaturan Anda saat ini. Jadilah eksplisit saat mengatur / membatalkan pengaturan pada skrip Anda.Perintah ini
set +o
mencantumkan pengaturan saat ini sebagai perintah yang mengembalikan keadaan yang sama, misalnyaAnda dapat dengan mudah mengembalikan semua opsi nanti, jika Anda menyimpan output ini ke variabel shell:
Bash juga menyertakan sejumlah opsi non-standar (bukan POSIX) yang disesuaikan menggunakan
shopt
perintah. Perintahshopt -p
ini dapat digunakan untuk menyimpan opsi-opsi ini dengan cara yang sama.Jika Anda hanya ingin menyimpan dan mengembalikan satu opsi, Anda dapat menggunakan variabel $ - environment, yang mencantumkan set opsi saat ini sebagai huruf, misalnya
Anda dapat menggunakan sesuatu seperti ini untuk menyimpan dan mengembalikan opsi tertentu:
sumber
Gunakan perangkap RETURN
RETURN
jebakan juga berfungsi untuk skrip bersumber.main_script.sh
a_script_to_be_sourced.sh
Uji
sumber
Mengembalikan pengaturan yang diaktifkan sebelumnya dapat dengan cepat dilakukan sebagai:
Sebaliknya (mengembalikan ke keadaan tidak aktif) AFAIK tidak ada jalan pintas dan jawaban Seppo mencakup semua kasus.
sumber
-bash: set: -i: invalid option
karena-i
bendera mencatat shell interaktif.