Dans Bash, lorsque vous placez un travail en arrière-plan (en utilisant CTRL+Z ou &), il n'attend pas que le travail se termine et donne un code de sortie de zéro (succès). C'est ce que vous avez observé, et c'est documenté dans le document man
pages.
Le comportement du "AND" logique, &&, est qu'il teste de gauche à droite. Chaque partie doit être réussie, donc si la première n'est pas réussie, la seconde ne sera pas exécutée. Ainsi, avec &&, il exécute les commandes de gauche à droite jusqu'à ce que l'une d'entre elles échoue. La définition du succès est un code de sortie ($ ?) égal à zéro.
Comparez cela avec le "OU" logique, ||, qui exécute les commandes de gauche à droite jusqu'à ce que l'une d'entre elles soit sélectionnée. travaux .
L'explication de la solution de sous coquille donnée par @NPE peut également être trouvée dans le man
pages :
Les commandes composées et les séquences de commandes de la forme 'a ; b ; c' ne sont pas gérées de façon élégante lorsque la suspension d'un 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é comme une unité.
Le terme adéquat pour CTRL+Z est la fonction suspendre personnage, toujours selon le man
pages :
Taper le caractère de suspension (typiquement ^Z, Control-Z) alors qu'un processus est en cours d'exécution entraîne l'arrêt de ce processus et le retour du contrôle à bash.
(Désolé de citer le man
pages tellement, mais ils sont vraiment vos amis et valent la peine d'être lus)
Si vous regardez stty -a
vous verrez quelque chose comme ceci :
susp = ^Z;
Vous pouvez donc le modifier, d'où l'expression "généralement". Mais ne le faites pas, vous risqueriez d'embrouiller tout le monde. Le pilote de terminal émet un signal SIGTSTP qui est piégé par Bash.
2 votes
command1; command2
devrait faire exactement ce que vous voulez. En ce qui concerne la terminologie, Ctrl-Z suspend le processus.0 votes
Eh bien, ce n'est pas le cas. J'utilise la version bash
4.2.8(2)-release
sur Mac OS X 10.8 dans iTerm2.0 votes
Merci pour la terminologie. Je vais mettre à jour la question pour l'utiliser.
0 votes
Oui, tu as raison, ça ne l'est pas. Je pense que vous avez besoin d'un subshell. Voir ma réponse.