La plupart des shells fournissent des fonctions telles que &&
et ;
d'enchaîner l'exécution des commandes de certaines manières. Mais que se passe-t-il si une commande est déjà en cours d’exécution, puis-je quand même ajouter une autre commande à exécuter en fonction du résultat de la première?
Dis que j'ai couru
$ /bin/myprog
some output...
mais je voulais vraiment /bin/myprog && /usr/bin/mycleanup
. Je ne peux pas tout tuer myprog
et tout redémarrer parce que trop de temps serait perdu. Je peux le Ctrl+ Zet fg
/ bg
si nécessaire. Est-ce que cela me permet d'enchaîner une autre commande?
Bash m'intéresse surtout, mais les réponses à toutes les questions communes sont les bienvenues!
%
,%1
et$!
. Il est important de fournir le PID sinon la deuxième commande sera toujours exécutée.wait
échouera à fournir le résultat souhaité. Il est courant d’utiliser les formes abrégées car elles sont moins sujettes aux fautes de frappe.fg
retourne avec le code de sortie du programme qu'il reprend. Vous pouvez donc suspendre votre programme avec ^Zpuis l'utiliserfg && ...
pour le reprendre.la source
myprog
deuxième suspension entraîne l'fg
arrêt du code de sortie 20 - différent de zéro, de sorte que lamycleanup
commande chaînée n'est pas exécutée.Vous ne savez pas si ce que vous demandez est possible, mais si vous avez toujours le shell à partir duquel vous avez démarré le programme, vous pouvez toujours vérifier
$?
l'état de sortie du dernier processus:la source
wait
commande dans Bash.Si le travail est au premier plan, l'une ou l'autre de ces commandes aura le même comportement que prévu.
NOTE: $? contiendra le statut de retour du programme en cours lors de sa fermeture.
Ceci indique explicitement ce que le shell ferait si vous aviez initialement entré la commande.
Si la première commande ne lit pas
stdin
et est exécutée au premier plan, vous pouvez entrer la nouvelle commande pendant l'exécution de la première. Le shell le lira et l'exécutera lors de l'exécution de la première commande. Si la commande s'exécute en arrière-plan, il est peu probable qu'elle soit en train de lirestdin
.EDIT: Vous
WAIT
pouvez également utiliser le travail en arrière-plan et utiliser la commande. Cela doit être fait avec précaution si d'autres tâches ont également été exécutées en arrière-plan. Une spécification de travail est requise pour que laWAIT
commande renvoie l'état du travail en attente.la source
wait
n'est pas idéal non plus. L'avantage, IMO, est que cela nous donne une API plus claire avec laquelle nous traitons. Taper plus de commandes sur la ligne de commande après que quelque chose soit en cours d’exploitation me paraissait un peu compliqué.wait
souffre toujours de ne pas obtenir un lien direct vers le PID en cours, en ce qui concerne le statut de retour. Cela semble être un problème plus lié à la façon dont Bash implémente les choses: stackoverflow.com/questions/356100/… . Cela pourrait donc être aussi bon que possible.