GNU/Linux >> Belajar Linux >  >> Linux

Membatalkan skrip shell jika ada perintah yang mengembalikan nilai bukan nol

Tambahkan ini ke awal skrip:

set -e

Ini akan menyebabkan shell segera keluar jika perintah sederhana keluar dengan nilai keluar bukan nol. Perintah sederhana adalah perintah apa pun yang bukan bagian dari pengujian if, while, atau until, atau bagian dari &&atau || daftar.

Lihat halaman manual bash(1) pada perintah internal "set" untuk detail lebih lanjut.

Saya pribadi memulai hampir semua skrip shell dengan "set -e". Sungguh menjengkelkan memiliki skrip yang terus berlanjut ketika ada sesuatu yang gagal di tengah dan merusak asumsi untuk skrip lainnya.


Jika Anda memiliki pembersihan yang perlu Anda lakukan saat keluar, Anda juga dapat menggunakan 'trap' dengan ERR sinyal semu. Ini bekerja dengan cara yang sama seperti menjebak INT atau sinyal lainnya; bash melempar ERR jika ada perintah yang keluar dengan nilai bukan nol:

# Create the trap with   
#    trap COMMAND SIGNAME [SIGNAME2 SIGNAME3...]
trap "rm -f /tmp/$MYTMPFILE; exit 1" ERR INT TERM
command1
command2
command3
# Partially turn off the trap.
trap - ERR
# Now a control-C will still cause cleanup, but
# a nonzero exit code won't:
ps aux | grep blahblahblah

Atau, terutama jika Anda menggunakan "set -e", Anda dapat menjebak EXIT; jebakan Anda kemudian akan dieksekusi ketika skrip keluar karena alasan apa pun, termasuk akhir yang normal, interupsi, keluar yang disebabkan oleh opsi -e, dll.


Pernyataan if dalam contoh Anda tidak diperlukan. Lakukan saja seperti ini:

dosomething1 || exit 1

Jika Anda mengikuti saran Ville Laurikari dan menggunakan set -e maka untuk beberapa perintah Anda mungkin perlu menggunakan ini:

dosomething || true

|| true akan membuat pipa perintah memiliki true mengembalikan nilai bahkan jika perintah gagal jadi -e opsi tidak akan mematikan skrip.


Untuk menambah jawaban yang diterima:

Ingatlah bahwa set -e terkadang tidak cukup, khususnya jika Anda memiliki pipa.

Misalnya, Anda memiliki skrip ini

#!/bin/bash
set -e 
./configure  > configure.log
make

... yang berfungsi seperti yang diharapkan:kesalahan dalam configure batalkan eksekusi.

Besok Anda membuat perubahan yang tampaknya sepele:

#!/bin/bash
set -e 
./configure  | tee configure.log
make

... dan sekarang tidak berhasil. Ini dijelaskan di sini, dan solusinya (khusus Bash) disediakan:

#!/bin/bash
set -e 
set -o pipefail

./configure  | tee configure.log
make

Linux
  1. Bagaimana cara menyimpan perintah dalam variabel dalam skrip Shell?

  2. Skrip Bash:Menggunakan perintah skrip dari skrip bash untuk mencatat sesi

  3. mengembalikan nilai dari skrip python ke skrip Shell

  1. Di mana variabel PATH diatur di Ubuntu?

  2. Bagaimana cara mengatur variabel lingkungan dalam GDB menggunakan perintah Shell?

  3. Jalankan skrip shell dari perintah docker-compose, di dalam container

  1. Shell Script Wrapper Untuk Mencegah Menjalankan Perintah Tanpa Argumen?

  2. Script Shell Hang Pada Perintah Mail?

  3. Bagaimana Mengenalinya Jika Output Dari Perintah Atau Skrip Shell Adalah Stdout Atau Stderr?