Il semble que le shell puisse exécuter simultanément des gestionnaires de signaux (actions d’interruption) si le shell reçoit un nouveau signal alors qu’il est occupé avec le précédent. Voici un exemple de script
handler() { echo -n '' } trap handler USR1 ...
Qui produit la sortie suivante
<ab<abcde>cde> ^ ^ ^ | | | signal received
Ce comportement interrompt les gestionnaires complexes.
J’ai trouvé expérimentalement que l’atomicité peut être obtenue grâce à l’exécution dans un sous-shell:
trap '(handler)' USR1 ^ ^ ^ | | | signal received
Et ce foo=$(handler)
est aussi atomique (au sens où il ne sera pas interrompu par un signal), permettant aux gestionnaires de changer l’état du shell.
Cependant, le problème semble être spécifique à Linux: bash sous Mac OS n’interrompt pas du tout les gestionnaires. Cela fait que ma solution repose sur un comportement non documenté pour surmonter le comportement spécifique à la plate-forme non documenté. Cela ne semble pas être fiable.
Je n’ai trouvé aucune connaissance sur le sujet. Existe-t-il un moyen standard / meilleur pour y faire face?