Skrip debugging, apa perbedaan antara -x ke set -euxo pipefail?

17

Cara utama yang saya tahu untuk men-debug skrip adalah menambahkan -xke shabang ( #!/bin/bash -x).

Baru-baru ini saya menemukan cara baru, menambahkan set -euxo pipefailtepat di bawah shabang, seperti pada:

#!/bin/bash
set -euxo pipefail

Apa perbedaan utama antara dua cara debugging? Apakah ada waktu Anda lebih suka yang satu di atas yang lain?

Sebagai mahasiswa baru, setelah membaca di sini , saya tidak bisa mengambil kesimpulan seperti itu.

JohnDoea
sumber

Jawaban:

15

Pertama, saya khawatir penjelasan -oopsi yang disajikan oleh http://explainshell.com tidak sepenuhnya benar.

Mengingat itu setadalah perintah bulit-in, kita dapat melihat dokumentasinya dengan helpmengeksekusi help set:

  -o option-name
      Set the variable corresponding to option-name:
          allexport    same as -a
          braceexpand  same as -B
          emacs        use an emacs-style line editing interface
          errexit      same as -e
          errtrace     same as -E
          functrace    same as -T
          hashall      same as -h
          histexpand   same as -H
          history      enable command history
          ignoreeof    the shell will not exit upon reading EOF
          interactive-comments
                       allow comments to appear in interactive commands
          keyword      same as -k
          monitor      same as -m
          noclobber    same as -C
          noexec       same as -n
          noglob       same as -f
          nolog        currently accepted but ignored
          notify       same as -b
          nounset      same as -u
          onecmd       same as -t
          physical     same as -P
          pipefail     the return value of a pipeline is the status of
                       the last command to exit with a non-zero status,
                       or zero if no command exited with a non-zero status
          posix        change the behavior of bash where the default
                       operation differs from the Posix standard to
                       match the standard
          privileged   same as -p
          verbose      same as -v
          vi           use a vi-style line editing interface
          xtrace       same as -x

Seperti yang Anda lihat -o pipefailartinya:

nilai balik dari sebuah pipa adalah status dari perintah terakhir untuk keluar dengan status bukan nol, atau nol jika tidak ada perintah yang keluar dengan status bukan nol

Tetapi tidak dikatakan: Write the current settings of the options to standard output in an unspecified format.

Sekarang, -xdigunakan untuk debugging seperti yang Anda sudah tahu dan -eakan berhenti mengeksekusi setelah kesalahan pertama dalam skrip. Pertimbangkan skrip seperti ini:

#!/usr/bin/env bash

set -euxo pipefail
echo hi
non-existent-command
echo bye

The echo byegaris tidak akan pernah dieksekusi ketika -edigunakan karena non-existent-commandtidak kembali 0:

+ echo hi
hi
+ non-existent-command
./setx.sh: line 5: non-existent-command: command not found

Tanpa -ebaris terakhir akan dicetak karena meskipun terjadi kesalahan, kami tidak meminta Bashuntuk keluar secara otomatis:

+ echo hi
hi
+ non-existent-command
./setx.sh: line 5: non-existent-command: command not found
+ echo bye
bye

set -e sering diletakkan di bagian atas skrip untuk memastikan bahwa skrip akan dihentikan ketika kesalahan pertama ditemukan - misalnya, jika mengunduh file gagal, tidak masuk akal untuk mengekstraknya.

Arkadiusz Drabczyk
sumber
Saya membaca jawabannya tetapi saya tidak yakin saya mendapatkan ini: Apa sintaks yang Anda rekomendasikan (saya percaya ini sedikit berbeda, seperti ini set -uxo pipefail).
JohnDoea
Jika Anda maksud set -eitu hanya akan menyebabkan skrip akan diakhiri karena kesalahan. Dalam contoh Anda, hanya satu dari banyak opsi yang ada bersama -uxo pipefail.
Arkadiusz Drabczyk
Saya bermaksud mengatakan saya tidak yakin apakah Anda menyarankan saya untuk menggunakan atau tidak menggunakan eargumen.
JohnDoea
1
Itu tergantung pada kebutuhan Anda. Ini tidak diatur secara default sehingga terserah penulis. Jika Anda yakin bahwa semua perintah yang digunakan dalam skrip akan selalu kembali 0pada kesuksesan dan bukan nol pada kegagalan, maka -eitu berguna tetapi karena yang lainnya harus digunakan dengan hati-hati.
Arkadiusz Drabczyk
1
Bisakah Anda memperluas jawabannya, menjelaskan mengapa -u direkomendasikan dalam konteks ini?
Patrice M.