Khi bạn nhấn Ctrl+ Ztrong một thiết bị đầu cuối, điều này làm cho nhóm quy trình nền trước nhận được tín hiệu SIGTSTP (giả sử thiết bị đầu cuối ở chế độ nấu và có các ràng buộc phím mặc định). Nếu quy trình không đặt trình xử lý tín hiệu cho SIGTSTP, điều này khiến quá trình bị đình chỉ (và ngay cả khi quy trình đã đặt trình xử lý tín hiệu, nó thường chỉ thực hiện một lượng nhỏ xử lý trước khi tạm dừng). Khi một quá trình bị giết, bị đình chỉ hoặc được nối lại, cha mẹ của nó được thông báo qua tín hiệu SIGCHLD; đây là nguyên nhân khiến shell hiển thị một dấu nhắc mới và có thể là một thông báo như thế nào [1] + 1234 suspended foo
. Luồng thông tin là
khóa → hệ thống treo → vỏ
và không phải
khóa → vỏ → hệ thống treo
để bạn không thể định cấu hình phản ứng khác cho Ctrl+ Z.
Bạn có thể đặt bẫy cho SIGCHLD, nhưng bẫy không được thực thi khi công việc là công việc tiền cảnh hiện tại. Đối với hầu hết các phần, điều này có nghĩa là bẫy chỉ được thực hiện khi một công việc nền kết thúc, chứ không phải khi công việc nền trước kết thúc. Nhưng nó cũng có nghĩa là bạn không thể phản ứng với việc đình chỉ công việc tiền cảnh.
Bạn có thể gián tiếp phản ứng với những thay đổi trong công việc nền bằng cách đặt precmd
móc so sánh trạng thái công việc với trạng thái được lưu từ lần precmd
chạy trước . Nhưng tôi không biết bạn có thể làm gì với điều đó: chỉ có thể có một khóa tạm dừng duy nhất, vì vậy bạn cần thêm một số thông tin để biết liệu quy trình này có nghĩa là tạm dừng, nền hoặc từ chối.
Tôi đã thiết lập zsh để nhấn Ctrl+ Ztại một dấu nhắc trống nền công việc hiện tại. Điều này cho phép tôi nhấn Ctrl+ Zhai lần để đặt công việc nền trước vào nền chỉ với một hệ thống treo ngắn.
fancy-ctrl-z () {
if [[ $#BUFFER -eq 0 ]]; then
bg
zle redisplay
else
zle push-input
fi
}
zle -N fancy-ctrl-z
bindkey '^Z' fancy-ctrl-z
Bạn có thể làm cho nó gọi disown
nếu bạn muốn. Hoặc bạn có thể sắp xếp cho một phần ba Ctrl+ Zđể gọi disown
với sửa đổi chưa được kiểm tra sau đây.
fancy-ctrl-z () {
if [[ $#BUFFER -eq 0 ]]; then
if (($fancy_ctrl_z_already_bg)); then
disown
else
bg
fancy_ctrl_z_already_bg=1
fi
zle redisplay
else
zle push-input
fi
}
zle -N fancy-ctrl-z
bindkey '^Z' fancy-ctrl-z
fancy_ctrl_z_precmd () {
fancy_ctrl_z_already_bg=0
}
precmd_functions+=fancy_ctrl_z_precmd
bg
+disown
thay vìkill -CONT -1234
.