Solusi 1:
set -e
menyebabkan shell keluar jika ada subperintah atau pipeline yang mengembalikan status bukan nol.
Jawaban yang mungkin dicari pewawancara adalah:
Akan berbahaya jika menggunakan "set -e" saat membuat skrip init.d:
Dari http://www.debian.org/doc/debian-policy/ch-opersys.html 9.3.2 --
Berhati-hatilah dalam menggunakan set -e dalam skrip init.d. Menulis skrip init.d yang benar memerlukan penerimaan berbagai status keluar kesalahan saat daemon sudah berjalan atau sudah berhenti tanpa membatalkan skrip init.d, dan pustaka fungsi init.d yang umum tidak aman untuk dipanggil dengan efek set -e. Untuk skrip init.d, seringkali lebih mudah untuk tidak menggunakan set -e dan sebagai gantinya memeriksa hasil dari setiap perintah secara terpisah.
Ini adalah pertanyaan yang valid dari sudut pandang pewawancara karena ini mengukur pengetahuan kerja kandidat tentang skrip dan otomatisasi tingkat server
Solusi 2:
Dari bash(1)
:
-e Exit immediately if a pipeline (which may consist of a
single simple command), a subshell command enclosed in
parentheses, or one of the commands executed as part of
a command list enclosed by braces (see SHELL GRAMMAR
above) exits with a non-zero status. The shell does not
exit if the command that fails is part of the command
list immediately following a while or until keyword,
part of the test following the if or elif reserved
words, part of any command executed in a && or ││ list
except the command following the final && or ││, any
command in a pipeline but the last, or if the command’s
return value is being inverted with !. A trap on ERR,
if set, is executed before the shell exits. This option
applies to the shell environment and each subshell envi-
ronment separately (see COMMAND EXECUTION ENVIRONMENT
above), and may cause subshells to exit before executing
all the commands in the subshell.
Sayangnya saya tidak cukup kreatif untuk memikirkan mengapa itu berbahaya, selain "skrip lainnya tidak akan dieksekusi" atau "ini mungkin menutupi masalah nyata".
Solusi 3:
Perlu dicatat bahwa set -e
dapat dihidupkan dan dimatikan untuk berbagai bagian skrip. Itu tidak harus aktif untuk seluruh eksekusi skrip. Bahkan bisa diaktifkan secara kondisional. Yang mengatakan, saya tidak pernah menggunakannya karena saya melakukan penanganan kesalahan saya sendiri (atau tidak).
some code
set -e # same as set -o errexit
more code # exit on non-zero status
set +e # same as set +o errexit
more code # no exit on non-zero status
Yang juga patut diperhatikan adalah ini dari bagian halaman manual Bash di trap
perintah yang juga menjelaskan bagaimana set -e
berfungsi dalam keadaan tertentu.
Jebakan ERR tidak dijalankan jika perintah yang gagal adalah bagian dari daftar perintah segera setelah kata kunci while atau until, bagian dari pengujian dalam pernyataan if, bagian dari perintah yang dieksekusi dalam daftar &&atau ⎪⎪, atau jika nilai pengembalian perintah adalah dibalik melalui !. Ini adalah ketentuan yang sama yang dipatuhi oleh opsi theerrexit.
Jadi ada beberapa kondisi di mana status bukan nol tidak akan menyebabkan keluar.
Saya pikir bahayanya adalah tidak memahami kapan set -e
ikut bermain dan ketika tidak dan mengandalkannya secara tidak benar di bawah beberapa asumsi yang tidak valid.
Lihat juga BashFAQ/105 Mengapa set -e (atau set -o errexit, atau trap ERR) tidak melakukan apa yang saya harapkan?
Solusi 4:
Perlu diingat ini adalah kuis untuk wawancara kerja. Pertanyaan mungkin telah ditulis oleh staf saat ini, dan mungkin salah. Ini tidak selalu buruk, dan semua orang membuat kesalahan, dan pertanyaan wawancara sering kali tertahan di sudut gelap tanpa ulasan, dan hanya keluar selama wawancara.
Sangat mungkin bahwa 'set -e' tidak melakukan apa pun yang kami anggap "berbahaya". Tetapi penulis pertanyaan itu mungkin secara keliru percaya bahwa 'set -e' berbahaya, karena ketidaktahuan atau bias mereka sendiri. Mungkin mereka menulis skrip buggy shell, itu dibom dengan mengerikan, dan mereka salah mengira bahwa 'set -e' yang harus disalahkan, padahal sebenarnya mereka lalai menulis pemeriksaan kesalahan yang benar.
Saya mungkin telah berpartisipasi dalam 40 wawancara kerja selama 2 tahun terakhir, dan pewawancara terkadang mengajukan pertanyaan yang salah, atau memiliki jawaban yang salah.
Atau mungkin ini adalah pertanyaan jebakan, yang terdengar janggal, tetapi tidak sepenuhnya tidak terduga.
Atau mungkin ini penjelasan yang bagus:http://www.mail-archive.com/[email protected]/msg473314.html
Solusi 5:
set -e
memberi tahu bash, dalam skrip, untuk keluar setiap kali ada yang mengembalikan nilai pengembalian bukan nol.
saya dapat melihat bagaimana itu akan mengganggu, dan buggy, tidak yakin tentang berbahaya, kecuali jika Anda telah membuka izin pada sesuatu, dan sebelum Anda dapat membatasinya lagi, skrip Anda mati.