Làm thế nào để chạy một lệnh trước khi tập lệnh Bash thoát ra?


119

Nếu tập lệnh Bash có set -evà một lệnh trong tập lệnh trả về lỗi, làm cách nào tôi có thể thực hiện dọn dẹp trước khi tập lệnh thoát?

Ví dụ:

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

Làm cách nào tôi có thể đảm bảo rằng điều đó /tmp/foođã bị loại bỏ, ngay cả khi một trong các lệnh ... do stuff ...bị lỗi?

Câu trả lời:


193

Đây là một ví dụ về việc sử dụng bẫy:

#!/bin/bash -e

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

trap cleanup EXIT
mkdir /tmp/foo
asdffdsa #Fails

Đầu ra:

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

Lưu ý rằng mặc dù dòng asdffdsa không thành công, quá trình dọn dẹp vẫn được thực hiện.


11

Từ bashmanpage (liên quan đến nội trang):

trap [-lp] [[arg] sigspec ...]
Lệnh arg được đọc và thực thi khi shell nhận được (các) tín hiệu sigspec.

Vì vậy, như được chỉ ra trong câu trả lời của Anon. , hãy gọi trapsớm trong tập lệnh để thiết lập trình xử lý bạn mong muốn trên ERR.


Chạy help trapđể xem một số trợ giúp về tích hợp sẵn.
Flimm

8

Từ tài liệu tham khảo cho set:

-e

Thoát ngay lập tức nếu một lệnh đơn giản (xem phần 3.2.1 Các lệnh đơn giản) thoát với trạng thái khác 0, trừ khi lệnh bị lỗi là một phần của vòng lặp Until hoặc while, một phần của câu lệnh if, một phần của && hoặc || hoặc nếu trạng thái trả về của lệnh đang được đảo ngược bằng cách sử dụng !. Một bẫy trên ERR, nếu được đặt, sẽ được thực hiện trước khi trình bao thoát ra.

(Nhấn mạnh của tôi).


Có thể đáng để thêm "-E" khi sử dụng "-e", xem vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail
Max Barraclough

3

shphiên bản câu trả lời của devguydavid .

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

ref: shellcript.sh


POSIXlàm tôi cười. :) Trang web giảng dạy tuyệt vời mà bạn đã liên kết.
Cometsong,
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.