Pourquoi est-ce qu'en utilisant bash et en suspendant une boucle while, la boucle s'arrête après avoir été reprise? Petit exemple ci-dessous.
$ while true; do echo .; sleep 1; done
.
.
^Z
[1]+ Stopped sleep 1
$ fg
sleep 1
$
Je connais les signaux et je suppose que cela peut être le comportement naturel de bash ici, mais j'aimerais mieux comprendre pourquoi il se comporte de cette manière particulière.
bash
shell
signals
background-process
bkzland
la source
la source
$?
du retour, et cetrue
n'est pas le cas alorstrue
. Probablement. je pense.Réponses:
Cela ressemble à un bogue dans plusieurs shells, il fonctionne comme prévu avec ksh93 et zsh .
Contexte:
La plupart des shells semblent exécuter la boucle while à l'intérieur du shell principal et
Bourne Shell suspend le shell entier si vous tapez ^ Z avec un shell sans connexion
bash suspend uniquement le
sleep
puis quitte la boucle while pour imprimer une nouvelle invite shellle tiret rend cette commande indéfendable
Avec ksh93 , les choses fonctionnent très différemment:
ksh93 fait de même, tandis que la commande est lancée la première fois, mais comme
sleep
c'est le cas dans ksh93, ksh93 a un gestionnaire qui fait que la boucle while déborde du shell principal puis se suspend au moment où vous tapez ^ Z.Si vous tapez ksh93 ultérieurement
fg
, l'enfant dérivé qui exécute toujours la boucle se poursuit.Vous voyez la principale différence lorsque vous comparez les messages de jobcontrol de bash et ksh93:
rapports bash :
[1]+ Stopped sleep 1
mais ksh93 rapporte:
^Z[1] + Stopped while true; do echo .; sleep 1; done
zsh se comporte comme ksh93
Avec les deux shells, vous avez un seul processus (le shell principal) tant que vous ne tapez pas ^ Z, et deux processus de shell après avoir tapé ^ Z.
la source
dash
finit pas réellement par gérer le signal lorsque la boucle se termine? dans[d]?ash
le code source, il y a toutes ces macros pour INTON et INTOFF dispersées à travers, et généralement les signaux reçus alors que dans un état INTOFF sont vraiment traités à (ou autour) INTON . de toute façon, je ne suis curieux que parce que je pense que vous savez mieux - c'est une excellente réponse. Merci.sleep 100
peut être suspendu et reprisdash
, il semble donc qu'ildash
connaisse les problèmes de cette commande et désactive sélectivement le contrôle des travaux.dash
les performances des autres shells en abandonnant le traitement multi-octets? et oui,dash
prend en charge le contrôle des travaux, mais la norme dit qu'un shell interactif doit ignorer TSTP, et l'exécution d'une boucle while dans le shell actuel sur un terminal interactif n'est pas moins un shell interactif que tout autre.J'ai écrit à l'un des co-auteurs de Bash à ce sujet, et voici sa réponse:
Donc, si quelqu'un veut soumettre un patch, utilisez les adresses e-mail trouvées dans les pages de manuel.
la source