Vì một lệnh như vậy sẽ chạy và (hy vọng) hoàn tất ở chế độ nền, nên tôi không thể nhận được trạng thái thoát của nó; được thôi.
Tuyên bố này là không chính xác để bắt đầu với:
#!/bin/bash
some_command &
pid = "$!"
đợi -n "$pid"
echo "Trạng thái là ${?}."
Nếu bạn muốn được thông báo ngay lập tức, bạn có thể sử dụng một vài thủ thuật dựa trên tín hiệu.
Xử lý SIGCHLD
sẽ là lựa chọn rõ ràng nhất, nhưng (1) hỗ trợ của nó trong Bash là lỗi và (2) mặc dù đặt -b
, bẩy
trình xử lý sẽ thực sự đợi ranh giới lệnh.
Điều đó nói rằng, tùy chọn tốt nhất tiếp theo (cũng làm gián đoạn quá trình xử lý tiền cảnh kéo dài ngay lập tức khi nào some_command
fail) là (tương đương với) tạo Ctrl+C cho toàn bộ nhóm quy trình của bạn. Điều này được phân phối và thực hiện ngay lập tức, bản thân shell có thể xử lý tín hiệu và tiếp tục, nếu muốn, trong khi quy trình nền trước có lẽ sẽ thoát theo mặc định, v.v.
#!/bin/bash
đặt -e
trình xử lý () {
tiếng vang 'báo hiệu lỗi lệnh'
bẫy - INT
}
xử lý bẫy INT
lai lịch() {
cục bộ -ir pid="$1"
sự thay đổi
"$@" || giết -INT -- -"$pid"
}
nền "$$" some_command &
# nhiệm vụ tiền cảnh chạy dài
echo 'trước khi xử lý lâu'
ngủ 5|| echo 'xử lý lâu bị gián đoạn'
echo 'sau khi xử lý lâu'
Cố gắng thay thế some_command
với (ví dụ.) ngủ 2
để kiểm tra trường hợp âthành côngâ.