Existe-t-il un moyen de fournir des tâches série sur le terminal pendant l'exécution d'une tâche (sans utiliser de fichier)?

14

Supposons qu'il y ait 2 tâches t1, t2qui peuvent être exécutées en série comme ci-dessous:

t1 ; t2
# OR
t1 && t2

Supposons maintenant que j'ai oublié de courir t2et que je cours t1déjà; puis-je ajouter t2au pipeline pour qu'il soit exécuté après la t1fin?

Abhimanyu Gupta
la source

Réponses:

19

Oui, vous pouvez:

  1. Mettez en pause le travail en cours d'exécution avec le caractère de suspension en appuyant sur Ctrl+ Z.
  2. Tapez fgou %, ajoutez ce que vous voulez à la liste et exécutez-le, par exemple:
    fg ; systemctl suspend # or
    % ; systemctl suspend
    Puisque fgrenvoie la valeur de retour du travail qu'il a repris, listez les opérateurs comme &&et ||travaillez comme prévu:
    fg && echo "Finished successfully!" # or
    % && echo "Finished successfully!"

man bash/ JOB CONTROL dit à propos du caractère suspendu:

La saisie du 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. (…) L'utilisateur peut alors manipuler l'état de ce travail, en utilisant la bgcommande pour le continuer en arrière-plan, la fg commande pour le continuer au premier plan, ou la killcommande pour le tuer. A ^Zprend effet immédiatement et a pour effet secondaire supplémentaire de supprimer la sortie en attente et la frappe.

fgest expliqué dans man bash/ SHELL BUILTIN COMMANDS :

fg [ jobspec ]
Reprendre jobspec au premier plan et en faire le travail en cours. Si jobspec n'est pas présent, la notion de shell du travail en cours est utilisée. La valeur renvoyée est celle de la commande placée au premier plan, ou échec si elle est exécutée lorsque le contrôle des travaux est désactivé ou, lorsqu'elle est exécutée avec le contrôle des travaux activé, si jobspec ne spécifie pas un travail valide ou si jobspec spécifie un travail qui a été démarré sans contrôle des travaux .

Lectures complémentaires (à part man bash) sur le contrôle des emplois:

dessert
la source
+1 mais c'est dommage que cela ne fonctionne pas lorsque vous oubliez t3dans t1; t2; t3ou t1 && t2 && t3.
JoL
@JoL C'est vrai - ^Z^Zet %-;%+;t3c'est assez bon dans certains cas, mais c'est loin d'être une vraie solution au problème.
dessert
2

J'ai vu cette méthode ici: /superuser/334272/how-to-run-a-command-after-an-already-running-existing-one-finishes

où vous faites d'abord Ctrl+ zpour arrêter (suspendre) celle qui est en cours d'exécution, puis vous exécutez la commande manquée comme ceci: fg && ./missed_cmd.shet elle s'exécutera dès la fgfin.

La fg(commande de premier plan) mettra le travail suspendu en ligne et &&garantira que la commande manquée n'est exécutée que si la première commande réussit.

George Udosen
la source