Nếu tôi sử dụng trap
như được mô tả, ví dụ như trên http://linuxcommand.org/wss0160.php#trap để bắt ctrl-c (hoặc tương tự) và dọn dẹp trước khi thoát thì tôi sẽ thay đổi mã thoát.
Bây giờ điều này có lẽ sẽ không tạo ra sự khác biệt trong thế giới thực (ví dụ: vì các mã thoát không phải là di động và trên hết không phải lúc nào cũng rõ ràng như được thảo luận trong Mã thoát mặc định khi quá trình kết thúc? ) Nhưng tôi vẫn tự hỏi liệu có tồn tại không thực sự không có cách nào để ngăn chặn điều đó và trả lại mã lỗi mặc định cho các tập lệnh bị gián đoạn?
Ví dụ (trong bash, nhưng câu hỏi của tôi không nên được coi là bash cụ thể):
#!/bin/bash
trap 'echo EXIT;' EXIT
read -p 'If you ctrl-c me now my return code will be the default for SIGTERM. ' _
trap 'echo SIGINT; exit 1;' INT
read -p 'If you ctrl-c me now my return code will be 1. ' _
Đầu ra:
$ ./test.sh # doing ctrl-c for 1st read
If you ctrl-c me now my return code will be the default for SIGTERM.
$ echo $?
130
$ ./test.sh # doing ctrl-c for 2nd read
If you ctrl-c me now my return code will be the default for SIGTERM.
If you ctrl-c me now my return code will be 1. SIGINT
EXIT
$ echo $?
1
(Đã chỉnh sửa để loại bỏ để phù hợp hơn với POSIX.)
(Đã chỉnh sửa một lần nữa để biến nó thành tập lệnh bash, thay vào đó, câu hỏi của tôi không cụ thể.)
Đã chỉnh sửa để sử dụng "INT" di động cho bẫy có lợi cho "SIGINT" không di động.
Chỉnh sửa để loại bỏ các dấu ngoặc nhọn vô dụng và thêm giải pháp tiềm năng.
Cập nhật:
Tôi đã giải quyết nó ngay bây giờ bằng cách thoát ra với một số mã lỗi được mã hóa cứng và bẫy EXIT. Điều này có thể có vấn đề trên một số hệ thống nhất định vì mã lỗi có thể khác nhau hoặc bẫy EXIT không thể thực hiện được nhưng trong trường hợp của tôi thì nó đủ ổn.
trap cleanup EXIT
trap 'exit 129' HUP
trap 'exit 130' INT
trap 'exit 143' TERM
read -p
đọc đầu vào từ bộ đồng xử lý hiện tại.
read
đọc từ bộ đồng xử lý hiện tại vàtrap cmd SIGINT
sẽ không hoạt động như tiêu chuẩn nói rằng bạn nên sử dụngtrap cmd INT
.