Wenn Sie in einem Terminal Ctrl+ drücken Z, empfängt die Prozessgruppe im Vordergrund das Signal SIGTSTP (vorausgesetzt, das Terminal befindet sich im gekochten Modus und die Standardtastenbindungen sind vorhanden). Wenn der Prozess keinen Signalhandler für SIGTSTP festgelegt hat, wird der Prozess angehalten (und selbst wenn der Prozess einen Signalhandler festgelegt hat, führt er normalerweise nur eine geringe Menge an Verarbeitung durch, bevor er sich selbst anhält). Wenn ein Prozess beendet, angehalten oder fortgesetzt wird, wird sein übergeordnetes Element über ein SIGCHLD-Signal benachrichtigt. Aus diesem Grund zeigt die Shell eine neue Eingabeaufforderung und möglicherweise eine Meldung wie an [1] + 1234 suspended foo
. Der Informationsfluss ist
Schlüssel → Suspension → Shell
und nicht
Schlüssel → Shell → Suspension,
sodass Sie für Ctrl+ keine andere Reaktion konfigurieren können Z.
Sie können einen Trap für SIGCHLD festlegen, der Trap wird jedoch nicht ausgeführt, wenn der Job der aktuelle Vordergrundjob ist. Zum größten Teil bedeutet dies, dass der Trap nur ausgeführt wird, wenn ein Hintergrundjob beendet wird, nicht wenn der Vordergrundjob beendet wird. Es bedeutet aber auch, dass Sie nicht auf die Unterbrechung des Vordergrundjobs reagieren können.
Sie können indirekt auf Änderungen in Hintergrundjobs reagieren, indem Sie einen precmd
Hook festlegen, der die Jobzustände mit den aus dem vorherigen precmd
Lauf gespeicherten Zuständen vergleicht . Aber ich weiß nicht, was Sie damit machen können: Es kann nur einen einzigen Suspend-Schlüssel geben, daher benötigen Sie einige zusätzliche Informationen, um zu wissen, ob der Prozess angehalten, im Hintergrund oder abgelehnt werden sollte.
Ich habe zsh so eingerichtet, dass das Drücken von Ctrl+ Zan einer leeren Eingabeaufforderung den aktuellen Job hinterlegt. Dadurch kann ich zweimal Ctrl+ drücken Z, um den Vordergrundjob mit nur einer kurzen Unterbrechung in den Hintergrund zu stellen.
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
Sie können es anrufen, disown
wenn Sie möchten. Oder Sie können einen dritten Ctrl+ ZAnruf disown
mit der folgenden ungetesteten Änderung veranlassen.
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
stattkill -CONT -1234
.