2011-10-24 3 views
1

Si je pose ce problème à l'invite bash: $ cmd_1; cmd_2Contrôle de travail de Bash - Pouvez-vous terminer la deuxième commande de la liste sans la terminer en premier?

cmd_1 est au premier plan. Puis-je empêcher l'exécution de cmd_2 sans interrompre cmd_1? J'ai jusqu'à ce que cmd_1 finisse, quand cmd_2 commencera, et alors il est trop tard.

Je ne pense pas que ce soit possible, mais peut-être avec le contrôle du travail?

Est-ce que -Z $ bg pousse les deux commandes dans le bg? Au lieu de cela, cmd_1 va-t-il à la bg et cmd_2 est (où? "En arrière-plan?" Comme @ cmd?) Attend toujours la sortie de cmd_1?

Les commandes n'ont pas été invoquées conditionnellement, ala "cmd_1 & & cmd_2", et les commandes n'étaient pas non plus mises en arrière-plan lors de l'invocation. cmd_1 est en cours d'exécution dans fg, cmd_2 doit encore être exécuté. Le visagepalm ici est que cmd_1 va prendre beaucoup de temps à compléter, cmd_2 est destructeur et je ne voudrais vraiment pas avoir à interrompre et refaire cmd_1 encore une fois. J'aimerais juste que cmd_1 se termine et que cmd_2 ne fonctionne pas du tout.

Je pourrais provoquer l'échec de cmd_2 en déplaçant cmd_2 vers cmd_2.sav jusqu'à ce que cmd_1 se termine et aboutir à un "-bash: cmd_2: commande non trouvée" mais j'espérais une solution plus élégante. cmd_2 pourrait être utilisé par d'autres avant la fin de cmd_1. (Oui, je pourrais envelopper cmd_2.real dans un wrapper cmd_2 avec un test d'utilisateur ou quelque chose, mais de cette façon se trouve la folie).

+4

Votre hypothèse est incorrecte. Cmd2 ne s'exécutera que lorsque cmd1 se terminera. Essayez 'cmd1 && cmd2' pour le faire fonctionner seulement si cmd1 réussit. – tripleee

+0

Merci pour la clarification sur le démarrage de cmd_2. La question suppose que la commande est invoquée, et non une méthode différente d'invocation. La question est sur la façon de modifier une commande en attente dans la "pile de commandes" (en supposant une telle chose dans l'interpréteur) – ChrisSM

+0

Je relis le commentaire et vois la confusion dans le libellé de ma question. Édité. – ChrisSM

Répondre

1

Il pourrait y avoir une meilleure façon, mais cela fonctionne:

  1. Control-Z Appuyez sur pour mettre en pause cmd_1.
  2. cmd_2 démarrera. Vous pouvez appuyer sur Control-C pour le tuer, ou vous pouvez faire votre "truc de renommer" avant l'étape 1 afin qu'il n'ait aucune chance de démarrer.
  3. Une fois que cmd_2 est mis hors service/bloqué, tapez fg pour reprendre l'opération cmd_1.

Si vous voulez essayer cela à l'avance pour assurer le comportement que vous obtenez est ce que vous attendez, la pratique avec une combinaison de sleep et echo commandes. c'est-à-dire, exécuter sleep 10; echo "hello" à partir du terminal. Si vous appuyez sur Control-Z, la commande sleep est suspendue et "hello" est affiché. Taper fg reprend le sommeil.

0

Dans ce cas particulier, il suffit d'ajouter ...

echo "Press a key to begin... ${0}" 
read 

Au début de cmd_2. De cette façon, vous ne gênez pas sérieusement quelqu'un qui veut utiliser cmd_2 et vous vous donnez une chance de le tuer avant qu'il ne détruise quelque chose que vous voulez préserver.

Questions connexes