GNU/Linux >> Tutoriels Linux >  >> Linux

Comment puis-je faire Ctrl-Z et bg en une seule touche pour que le processus continue en arrière-plan?

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.


Linux
  1. Comment suspendre et mettre un processus d'arrière-plan au premier plan ?

  2. Comment exécuter le processus Rsync en arrière-plan

  3. Comment un processus peut-il intercepter stdout et stderr d'un autre processus sous Linux ?

  4. Comment obtenir l'ID de processus du processus d'arrière-plan ?

  5. Processus d'arrière-plan sous Linux

[Bash Tips] Comment cd et ls en une seule commande

[Bash Tips] Comment cp ou mv et cd en une seule commande

Comment travailler avec le processus de premier plan et d'arrière-plan sous Linux

Comment puis-je supprimer un mot de passe et verrouiller le compte en une seule étape ?

Puis-je limiter un utilisateur (et ses applications) à une seule interface réseau ?

Comment renicer tous les threads (et enfants) d'un processus sous Linux ?