Làm thế nào để thiết lập bẫy trong các hàm bash?


13

Tôi có thể thiết lập traptrong các tập lệnh bash nhưng không có chức năng bash.

Ví dụ: sourcemã bên dưới và chạy f, bây giờ hãy thử Ctrl+ C, nó không bị kẹt!

Làm thế nào để thiết lập các trapchức năng bash?

  4 trap ctrl_c INT
  5 
  6 ctrl_c () {
  7  echo "** Trapped CTRL-C"
  8 }
  9 
 10 
 11 f () {
 12   for i in `seq 1 100`; do
 13     sleep 1
 14     echo -n "."
 15   done
 16 } 

2
Bạn có thể đặt một fphần cuối của mã của bạn và xóa khoảng trắng khỏi f ().
GWF

Câu trả lời:


7

Đó là bởi vì nó gửi SIGINT đến tiến trình ở nền trước thay vì bash(đang chạy tập lệnh). Nếu bạn muốn làm điều này, hãy làm cho hàm không đồng bộ và sau đó sử dụng wait(sẽ hoạt động như mong đợi và sử dụng bẫy).


Đó là loại công trình. Nhưng tôi thấy rằng nếu fở trong một đường ống echo 123 | f, thì đó không phải là bẫy?
Cheng

@Cheng Sử dụng một subshell (và một đường ống trong trường hợp này dù sao cũng không cần thiết, chỉ cần sử dụng heredoc / herestring). (command | command) &
Chris Xuống

1

Protip: Gửi quy trình tiền cảnh một QUIT với Ctrl- \khi Ctrl- C, - Z, - Dkhông hoạt động.

Xóa bẫy khi kết thúc thực hiện với trap - list of signals here

Thú vị trên một hệ thống phi sản xuất: Hãy thử đặt bẫy cho tất cả các tín hiệu hợp lý (ví dụ: không phải KILL). kill -l(không phải chữ thường chữ L không phải là số 1 hoặc ống |)


0

Tôi nghĩ bạn nên làm cho chức năng toàn cầu

#!/bin/bash
trap ctrl_c INT
ctrl_c () {
  echo "** Trapped CTRL-C"
} 
for i in `seq 1 100`; do
  sleep 1
  echo -n "."
done

INTSIGINTđồng nghĩa - nó sẽ không tạo ra sự khác biệt.
Chris Xuống
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.