GNU/Linux >> Belajar Linux >  >> Linux

Apa yang dilakukan 'set -e', dan mengapa dianggap berbahaya?

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.


Linux
  1. Apa itu Makefile dan bagaimana cara kerjanya?

  2. Apa itu TAM dan mengapa Anda ingin menjadi TAM?

  3. Apa yang dilakukan `set -x`?

  1. Apa itu `S_ISREG()`, dan apa fungsinya?

  2. Apa itu GPU Matrox dan mengapa server UNIX universitas saya memilikinya?

  3. Apa itu email, dan bagaimana navigasinya?

  1. Apa itu server Linux dan mengapa bisnis Anda membutuhkannya?

  2. Apa itu Perintah Chown di Linux dan Cara Menggunakannya

  3. Apa itu Perintah cURL Dan Bagaimana Cara Menggunakannya?