2010-01-25 38 views
85

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

Ví dụ:

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

Làm thế nào tôi có thể đảm bảo rằng /tmp/foo được lấy ra, ngay cả khi một trong những lệnh trong ... do stuff ... thất bại?

Trả lời

131

Dưới đây là một ví dụ của việc sử dụng bẫy:

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

Output:

[email protected]:~ $ sh traptest 
t: line 9: asdffdsa: command not found 
Removing /tmp/foo 
[email protected]:~ $ 

Chú ý rằng mặc dù các dòng asdffdsa thất bại, dọn dẹp vẫn được thực hiện.

5

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

-e

Exit ngay lập tức nếu một lệnh đơn giản (xem phần 3.2.1 Simple Commands) thoát ra với một tổ chức phi zero trạng thái, trừ khi lệnh thất bại là một phần của vòng lặp cho đến hoặc trong khi, một phần của câu lệnh if, một phần của một & & hoặc || danh sách, hoặc nếu tình trạng 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, được thực thi trước khi thoát khỏi trình bao.

(Mỏ nhấn mạnh).

9

Từ bash manpage (builtins liên quan):

bẫy [-lp] [[arg] SIGSPEC ...]
Các arg lệnh là để được đọc và thực thi khi vỏ nhận tín hiệu (s) sigspec.

Vì vậy, như được nêu trong Anon.'s answer, hãy gọi số trap sớm trong tập lệnh để thiết lập trình xử lý bạn muốn trên ERR.

+3

Bạn cũng có thể bẫy trên EXIT. –

+0

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

6

đây là reference cho bạn về các tín hiệu bẫy và thiết lập liên quan. Có một cái nhìn.

+0

Đó là chính xác những gì tôi đang tìm kiếm cảm ơn bạn. – nelaaro

Các vấn đề liên quan