2017-01-12 18 views
5

kịch bản của tôi có như hướng dẫn đầu tiên:Bash: làm thế nào để bẫy -e, nhưng không thoát khỏi

set -e 

Vì vậy, bất cứ khi nào một lỗi xảy ra, kịch bản hủy bỏ. Tôi muốn bẫy tình huống này để hiển thị thông báo thông tin, nhưng tôi không muốn hiển thị thông báo đó bất cứ khi nào tập lệnh thoát; CHỈ khi set -e kích hoạt phá thai. Có thể bẫy tình huống này không?

này:

set -e 

function mytrap { 
    echo "Abnormal termination!" 
} 

trap mytrap EXIT 

error 

echo "Normal termination" 

Được gọi trong lối nào (cho dù là một lỗi xảy ra hay không), mà không phải là những gì tôi muốn.

+0

Gọi hàm ở các điểm thoát bình thường để đặt cờ cho biết chấm dứt thông thường. Giá trị này có thể được kiểm tra bởi hàm bẫy của bạn để phân biệt giữa kết thúc bình thường và bất thường. – codeforester

+0

@codeforester Yepp, tôi đã suy nghĩ về những điều khoản đó. Một chút cồng kềnh mặc dù – dangonfast

Trả lời

5

Thay vì sử dụng trap trên EXIT, sử dụng nó trên ERR sự kiện:

trap mytrap ERR 

Full Code:

set -e 

function mytrap { 
    echo "Abnormal termination!" 
} 

trap mytrap ERR 

(($#)) && error 

echo "Normal termination" 

Bây giờ chạy nó cho thế hệ lỗi:

bash sete.sh 123 
sete.sh: line 9: error: command not found 
Abnormal termination! 

Và đây là lối ra thông thường:

bash sete.sh 
Normal termination 
+2

Tôi đã không nhận thức được cái bẫy "ERR". Giải thích tuyệt vời, @anubhava! – codeforester

+1

Cảm ơn anubhava. Đây không phải là lần đầu tiên tôi thấy bạn bảnh bao như thế nào. Bạn có lời khuyên nào về lập trình bash tiên tiến không? Liên kết hoặc sách được hoan nghênh! – dangonfast

+0

Và '(($ #)) && error' nghĩa là gì? :) – dangonfast

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