GNU/Linux >> Belajar Linux >  >> Linux

Apa arti set -e dalam skrip bash?

Dari help set :

  -e  Exit immediately if a command exits with a non-zero status.

Tapi itu dianggap praktek buruk oleh beberapa (bash FAQ dan irc freenode #bash FAQ penulis). Direkomendasikan untuk menggunakan:

trap 'do_something' ERR

untuk menjalankan do_something berfungsi saat terjadi kesalahan.

Lihat http://mywiki.wooledge.org/BashFAQ/105


set -e menghentikan eksekusi skrip jika perintah atau pipa memiliki kesalahan - yang merupakan kebalikan dari perilaku shell default, yaitu mengabaikan kesalahan dalam skrip. Ketik help set di terminal untuk melihat dokumentasi untuk perintah bawaan ini.


Sesuai bash - Manual Set Builtin, jika -e /errexit disetel, shell akan segera keluar jika pipeline yang terdiri dari satu perintah sederhana, daftar, atau perintah gabungan mengembalikan status bukan nol.

Secara default, status keluar dari pipeline adalah status keluar dari perintah terakhir dalam pipeline, kecuali pipefail opsi diaktifkan (dinonaktifkan secara default).

Jika demikian, pipeline mengembalikan status perintah terakhir (paling kanan) untuk keluar dengan status bukan nol, atau nol jika semua perintah berhasil keluar.

Jika Anda ingin mengeksekusi sesuatu saat keluar, coba tentukan trap , misalnya:

trap onexit EXIT

di mana onexit adalah fungsi Anda untuk melakukan sesuatu saat keluar, seperti di bawah ini yang mencetak jejak tumpukan sederhana:

onexit(){ while caller $((n++)); do :; done; }

Ada opsi serupa -E /errtrace yang malah menjebak ERR, mis.:

trap onerr ERR

Contoh

Contoh status nol:

$ true; echo $?
0

Contoh status bukan nol:

$ false; echo $?
1

Meniadakan contoh status:

$ ! false; echo $?
0
$ false || true; echo $?
0

Uji dengan pipefail dinonaktifkan:

$ bash -c 'set +o pipefail -e; true | true | true; echo success'; echo $?
success
0
$ bash -c 'set +o pipefail -e; false | false | true; echo success'; echo $?
success
0
$ bash -c 'set +o pipefail -e; true | true | false; echo success'; echo $?
1

Uji dengan pipefail sedang diaktifkan:

$ bash -c 'set -o pipefail -e; true | false | true; echo success'; echo $?
1

Saya menemukan posting ini ketika mencoba mencari tahu apa status keluar untuk skrip yang dibatalkan karena set -e . Jawabannya tidak tampak jelas bagi saya; maka jawaban ini. Pada dasarnya, set -e membatalkan eksekusi perintah (misalnya skrip shell) dan mengembalikan kode status keluar dari perintah yang gagal (yaitu skrip dalam, bukan skrip luar) .

Misalnya, saya memiliki skrip shell outer-test.sh :

#!/bin/sh
set -e
./inner-test.sh
exit 62;

Kode untuk inner-test.sh adalah:

#!/bin/sh
exit 26;

Ketika saya menjalankan outer-script.sh dari baris perintah, skrip luar saya diakhiri dengan kode keluar dari skrip dalam:

$ ./outer-test.sh
$ echo $?
26

Linux
  1. Apa yang Dilakukan 'exec {fd}/watchdog' Di Bash?

  2. Apa Artinya `:-` Dalam Skrip Shell?

  3. Apa Artinya "rm Di-Hash"?

  1. Apa arti peringatan ini?

  2. Apa yang dimaksud dengan [email dilindungi] dalam skrip shell?

  3. Naikkan kesalahan dalam skrip Bash

  1. Bagaimana jika [[ $? -ne 0 ]]; berarti dalam .ksh

  2. Apa yang dilakukan `set -x`?

  3. Apa yang dimaksud dengan gema $? melakukan?