Bagaimana cara menjalankan perintah sebelum skrip Bash keluar?

119

Jika skrip Bash memiliki set -e, dan perintah dalam skrip mengembalikan kesalahan, bagaimana saya bisa melakukan pembersihan sebelum skrip keluar?

Sebagai contoh:

#!/bin/bash
set -e
mkdir /tmp/foo
# ... do stuff ...
rm -r /tmp/foo

Bagaimana saya bisa memastikan itu /tmp/foodihapus, bahkan jika salah satu perintah ... do stuff ...gagal?

David Wolever
sumber

Jawaban:

193

Berikut contoh penggunaan trap:

#!/bin/bash -e

function cleanup {
  echo "Removing /tmp/foo"
  rm  -r /tmp/foo
}

trap cleanup EXIT
mkdir /tmp/foo
asdffdsa #Fails

Keluaran:

dbrown@luxury:~ $ sh traptest
t: line 9: asdffdsa: command not found
Removing /tmp/foo
dbrown@luxury:~ $

Perhatikan bahwa meskipun baris asdffdsa gagal, pembersihan masih dijalankan.

devguydavid.dll
sumber
11

Dari halaman bashmanual (tentang bawaan):

trap [-lp] [[arg] sigspec ...]
Perintah arg harus dibaca dan dijalankan ketika shell menerima sinyal sigspec.

Jadi, seperti yang ditunjukkan dalam jawaban Anon. , Panggil trapdi awal skrip untuk menyiapkan penangan yang Anda inginkan di ERR.

dmckee --- kucing mantan moderator
sumber
Jalankan help trapuntuk melihat bantuan di built-in.
Flimm
8

Dari referensi untuk set:

-e

Keluar segera jika perintah sederhana (lihat bagian 3.2.1 Perintah Sederhana) keluar dengan status bukan nol, kecuali jika perintah yang gagal adalah bagian dari loop sampai atau sementara, bagian dari pernyataan if, bagian dari && atau || daftar, atau jika status kembalian perintah dibalik menggunakan!. Perangkap pada ERR, jika disetel, dijalankan sebelum shell keluar.

(Penekanan saya).

Segera.
sumber
Mungkin layak menambahkan "-E" saat menggunakan "-e", lihat vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail
Max Barraclough
3

shversi jawaban devguydavid .

#!/bin/sh
set -e
cleanup() {
  echo "Removing /tmp/foo"
  rm  -r /tmp/foo
}
trap cleanup EXIT
mkdir /tmp/foo
asdffdsa #Fails

ref: shellscript.sh

Saftever
sumber
POSIXbuat aku tersenyum. :) Situs pengajaran hebat yang Anda tautkan juga.
Cometsong