Exécuter une commande après l’autre, même si je suspends le premier (Ctrl-z)

Je sais en bash je peux exécuter une commande après l’autre en les séparant par des points-virgules, comme

$ command1; command2 

Ou si je veux que la command2 ne soit exécutée que si command1 réussit, en utilisant && :

 $ command1 && command2 

Cela fonctionne, mais si je suspends la command1 utilisant Ctrl-z , dans le premier cas, elle exécute command2 immédiatement, et dans le second cas, elle ne l’exécute pas du tout. Comment puis-je exécuter des commandes en séquence, mais être toujours capable de suspendre la première commande, mais ne pas avoir la deuxième exécution tant que je ne l’ai pas redémarrée (avec fg ) et qu’elle se termine? Je préférerais quelque chose d’aussi simple à taper que je voudrais le faire de manière interactive. Ou peut-être ai-je juste besoin de définir une option quelque part.

Au fait, quel est le terme approprié pour ce que fait Ctrl-z ?

Ce qui suit devrait le faire:

 (command1; command2) 

Notez les parenthèses ajoutées.

Dans Bash, lorsque vous placez un travail en arrière-plan (en utilisant CTRL + Z ou &), il n’attend pas la fin du travail et donne un code de sortie égal à zéro (succès). Tout ce que vous avez observé, et cela est documenté dans les pages de man .

Le comportement de logique “AND”, &&, est qu’il teste de gauche à droite. Chaque partie doit être réussie, donc si la première échoue, la seconde ne fonctionnera pas. Ainsi, avec && lance des commandes de gauche à droite jusqu’à ce que l’une d’elles échoue. La définition du succès est un code de sortie ($?) De zéro.

Contrastez ceci avec “OU” logique, ||, qui exécute les commandes de gauche à droite jusqu’à ce que l’une d’elles fonctionne .

Vous trouverez également des explications sur la solution de sous-shell fournie par @NPE dans les pages de man :

Commandes composées et séquences de commandes de la forme ‘a; b; c ‘ne sont pas traités avec élégance lorsque la suspension du processus est tentée. Lorsqu’un processus est arrêté, le shell exécute immédiatement la commande suivante dans la séquence. Il suffit de placer la séquence de commandes entre parenthèses pour la forcer dans un sous-shell, qui peut être arrêté en tant qu’unité.

Le terme approprié pour CTRL + Z est le caractère de suspension , toujours à partir des pages de man :

Taper le caractère de suspension (généralement ^ Z, Control-Z) pendant l’exécution d’un processus entraîne l’arrêt de ce processus et renvoie le contrôle à bash.

(Désolé de citer autant les pages de man , mais elles sont vraiment vos amis et valent la peine d’être lues)

Si vous regardez stty -a vous verrez quelque chose comme ceci:

 susp = ^Z; 

Vous pouvez donc le modifier, d’où l’expression “typiquement”. Ne fais pas ça cependant, ça va semer la confusion chez tout le monde. Le pilote de terminal déclenche un signal SIGTSTP intercepté par Bash.