2011-11-14 16 views
24

Tôi nhìn thấy rất nhiều kịch bản shell mà làm:Có cần phải chỉ định các bẫy khác với EXIT không?

 
trap cmd 0 1 2 3 13 15 # EXIT HUP INT QUIT PIPE TERM 

Trong mỗi vỏ Tôi có quyền truy cập vào tại thời điểm này, tất cả những cái bẫy khác hơn 0 là không cần thiết, và cmd sẽ được thực hiện khi nhận được tín hiệu nếu cái bẫy được chỉ định một cách đơn giản:

 
trap cmd 0 

Thông số sau có đủ hay một số vỏ yêu cầu các tín hiệu khác được chỉ định?

Trả lời

15

Để đảm bảo xử lý EXIT tín hiệu sẽ không được thực hiện hai lần (đó là hầu như luôn luôn không phải những gì bạn muốn) nó nên luôn luôn thiết lập để được bỏ qua hoặc thiết lập lại trong định nghĩa của handler EXIT tín hiệu riêng của mình.

Cũng vậy với các tín hiệu có nhiều bộ xử lý tín hiệu được xác định cho chúng trong một chương trình.

# reset 
trap 'excode=$?; cmd; trap - EXIT; echo $excode' EXIT HUP INT QUIT PIPE TERM 

# ignore 
trap 'excode=$?; trap "" EXIT; cmd; echo $excode' EXIT HUP INT QUIT PIPE TERM 
+0

Đây là một ý tưởng hay. Tôi không tin rằng nó là cần thiết để lo lắng về tín hiệu với nhiều hơn một cái bẫy được xác định, vì bạn chỉ có thể xác định một bẫy cho mỗi tín hiệu. (Cái bẫy thứ hai thay thế cái đầu tiên, thay vì thêm vào một chồng.) Một số hệ vỏ có cho phép nhiều bẫy được xác định không? –

+2

Tôi đã bị nhầm lẫn giống như @WilliamPursell cho đến khi tôi cuối cùng nhận thấy "bị bỏ qua ** hoặc ** đặt lại". –

13

Tôi nghĩ bẫy 0 được thực thi ngay trước khi chấm dứt tập lệnh trong mọi trường hợp, vì vậy rất hữu ích cho chức năng dọn dẹp (như xóa các tệp tạm thời, v.v.). Các tín hiệu khác có thể có xử lý lỗi chuyên biệt nhưng nên chấm dứt tập lệnh (tức là, gọi thoát).

Những gì bạn đã mô tả, tôi tin rằng, thực sự sẽ thực thi cmd hai lần. Một lần cho tín hiệu (ví dụ SIGTERM) và một lần nữa khi thoát (bẫy 0).

Tôi tin rằng cách thích hợp để làm điều này là như sau (xem POSIX đặc điểm kỹ thuật cho trap):

trap "rm tmpfile" 0 
trap "exit 1" TERM HUP ... 

Điều này đảm bảo một tập tin tạm thời được gỡ bỏ sau khi hoàn thành kịch bản, và cho phép bạn thiết lập trạng thái thoát tùy chỉnh trên tín hiệu.

LƯU Ý: bẫy 0 được gọi là tín hiệu có gặp phải hay không.

Nếu bạn không quan tâm đến việc đặt trạng thái thoát, bẫy 0 sẽ là đủ.

5

Tiêu chuẩn vỏ không xác định liệu một cái bẫy trên 0 được thực hiện khi nhận được tín hiệu chưa được gỡ bỏ. Đặc biệt, bash và dấu gạch ngang hoạt động khác nhau. Với trap cmd-list 0 không có bẫy đặt cho bất kỳ tín hiệu nào, bash sẽ thực hiện danh sách cmd khi nhận SIGTERM, nhưng dấu gạch ngang sẽ không. Với trap cmd-list 0 2, bash thực thi cmd-list một lần sau khi nhận được SIGTERM, và dấu gạch ngang thi hành cmd-list hai lần.

+2

Vì vậy, câu trả lời hay nhất là sự kết hợp của thương hiệu này và Brandon Horsley: vì tính di động, không giả định rằng 'bẫy ... 0' sẽ được thực thi trên SIGTERM và không cho rằng nó đã thắng 't. Thực hiện một lối thoát 'trap 'riêng biệt 1" SIGTERM ... 'để đảm bảo rằng nó sẽ xuất hiện. – dubiousjim

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