Ctrl-C trong tập lệnh bash


22

Làm cách nào để triển khai ctrl+ cxử lý trong các tập lệnh bash để tập lệnh bị gián đoạn, cũng như lệnh đang chạy bởi tập lệnh?

(Hãy tưởng tượng có một tập lệnh thực thi một số lệnh chạy dài. Người dùng nhấn ctrl+ cvà ngắt lệnh, nhưng tập lệnh tiếp tục.) Tôi cần nó để hành xử theo cách mà cả hai đều bị giết.


1
Nếu hệ điều hành của bạn được kích hoạt kiểm soát công việc, một tùy chọn khác sẽ là dừng tập lệnh đó (thường là với crtl-z). Bạn có thể tiếp tục công việc đó trong nền với bg, giết nó hoặc tiếp tục công việc ở phía trước với fg. Xem phần bash manpage JOB CONTROL.
ott--

Câu trả lời:


25

Bạn làm điều này bằng cách tạo một chương trình con bạn muốn gọi khi nhận được SIGINT và bạn cần chạy trap 'subroutinename' INT.

Thí dụ:

#!/bin/bash

int_handler()
{
    echo "Interrupted."
    # Kill the parent process of the script.
    kill $PPID
    exit 1
}
trap 'int_handler' INT

while true; do
    sleep 1
    echo "I'm still alive!"
done

# We never reach this part.
exit 0

2
Lưu ý rằng bạn cũng có thể mắc bẫy EXITtrong trường hợp bạn có thứ gì đó bạn muốn thực thi bất cứ khi nào tập lệnh thoát ra bất kể nó dừng như thế nào. ( KILLtất nhiên, ngoại trừ.)
Blrfl

Cảm ơn rất nhiều! Tuy nhiên, khi 'ngủ' bị giết - trình bao vẫn có thể quản lý để thực thi lệnh tiếp theo trong khi thói quen bẫy đang chạy: 'echo' trong trường hợp này ... hoặc tôi sai?
kolypto

Điều đó không nên là có thể, không. Nó không thực hiện các nhiệm vụ song song.
Kvisle
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.