Le Ctrl +Z La séquence est gérée par le terminal, pas par le shell. (Contexte utile :quelle est la différence exacte entre un 'terminal', un 'shell', un 'tty' et une 'console' ?)
Seul un petit ensemble de fonctions non extensible peut être lié à une touche dans un terminal. Vous pouvez personnaliser les touches liées à ces fonctions mais pas ajouter une autre fonction. Ces fonctions se répartissent en trois catégories :
- Édition en ligne de commande dans les programmes qui ne proposent pas le leur (mode canonique, aussi appelé mode cuit (par opposition au mode brut), que vous utiliserez rarement en pratique) :fin de fichier (
eof
, Ctrl +D ), fin de ligne (eol
, Ctrl +M ), effacer le caractère à gauche (erase
, Ctrl +H ), effacer le mot à gauche (werase
, Ctrl +W ), effacer la ligne (kill
, Ctrl +U ). - Contrôle de flux manuel :
stop
(Ctrl +S ),start
(Ctrl +Q ). Utile uniquement sur les anciens terminaux série qui supprimaient des caractères lorsque le terminal ne pouvait pas suivre l'ordinateur ou vice versa. - Signalisation :interruption (
intr
, Ctrl +C ), forcer à quitter (quit
, Ctrl +\ ), suspendre (Ctrl +Z ).
Certains systèmes, y compris Linux, étendent cette liste, mais je n'en ai jamais vu un qui incluait le backgrounding. Notez qu'il prendrait en charge à la fois le pilote de terminal du noyau et l'émulateur de terminal. Vous devez donc vous contenter de suspendre, qui envoie au travail de premier plan un signal SIGTSTP. Cela déclenche un SIGCHLD dans le processus parent du leader du travail de premier plan, qui est généralement le shell. Lorsque le shell reçoit SIGCHLD, il appelle waitpid
pour comprendre pourquoi il a été notifié, et lors de la détection qu'un travail d'arrière-plan a été suspendu, il affiche une notification (par exemple [1] + 12345 suspended mycommand
) et une nouvelle invite.
Vous pouvez programmer le shell pour envoyer un SIGCONT
signal au travail de premier plan. Je ne pense pas que zsh ait un crochet pour cela, vous auriez besoin de patcher le code source. Et il n'y a aucun moyen pour zsh de savoir si vous vouliez vraiment interrompre le programme (oups, ce programme peut faire la mauvaise chose, laissez-moi le suspendre pendant que je le trie) ou le mettre en arrière-plan.
Ce que je fais est de définir le Ctrl +Z séquence de touches en zsh pour mettre en arrière-plan le travail en cours (%%
). De cette façon, je peux envoyer le travail de premier plan en arrière-plan en appuyant sur Ctrl +Z Ctrl +Z . Tant que j'y suis, je fais Ctrl +Z faire autre chose d'utile lorsque la ligne d'entrée actuelle n'est pas vide (donc je ne viens pas de revenir d'un sous-processus):"suspendre" la ligne d'entrée actuelle, me permettant de taper une autre commande, après quoi la ligne interrompue est repoussée dans le tampon d'entrée.
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
^z ^z comme zsh ci-dessus est possible dans bash, bien que ce soit un peu compliqué et que je ne l'ai pas exécuté depuis longtemps :
- Dans votre .inputrc, incluez le mappage
"\C-z": "bg\n"
- Dans la variable bash PS0, incluez `$(stty susp ^z)'
- Dans la variable bash PROMPT_COMMAND, incluez 'stty susp ^@'
donc ^z pour suspendre est activé lorsqu'une commande est exécutée, puis désactivé pour l'invite bash.