Dans Bash, de temps en temps, je tape une liste de commandes et je frappe Enter, et je ne réalise que plus tard qu'il y a une erreur avec une commande vers la fin de la liste. Je sais que si j'appuie sur Ctrl+, Ccela mettra fin à la commande en cours d'exécution et annulera le reste de la liste. Existe-t-il un moyen d'annuler le reste de la liste sans terminer la commande en cours d'exécution?
Par exemple, disons que j'ai tapé quelque chose comme
foo; bar
ou
foo && bar
où foo
est une commande de longue durée qu'il est très important de ne pas interrompre, et bar
fait quelque chose d'irréversible et indésirable (par exemple, shutdown -h now
ou rm -rf /
). Pendant qu'il foo
est toujours en cours d'exécution, existe-t-il un moyen général de dire au shell de laisser foo
finir mais de ne pas courir bar
après? (Oui, je pourrais modifier les autorisations bar
afin qu'il ne soit pas exécutable, mais ce n'est pas particulièrement pratique si je souhaite utiliser bar
quelque chose comme rm
ça en attendant, et cela ne fonctionnera pas si je ne suis pas propriétaire bar
ou s'il bar
s'agit d'un module intégré.)
la source
bar
commande poursome_command
:^bar^some_command
avant d'être exécutée.Réponses:
J'ai observé que l'utilisation CtrlZpour déplacer le programme vers un processus d'arrière-plan fait l'affaire.
Merci à @Arkadiusz Drabczyk de l'avoir pointé dans des commentaires qui
foo; bar
ne donnent pas le contrôle de la manière requise.Ensuite:
La commande arrête uniquement la première tâche et
Cela met uniquement la tâche
foo
au premier plan et termine la tâche et quitte.PS: Cela peut être vérifié avec deux scripts écrivant dans un fichier. Le premier dort quelques secondes pour laisser le temps de se remettre.
Je suis perdu sur la raison pour laquelle la CtrlZseule commande s'exécute et laisse le reste. J'adorerais faire connaissance.
la source
bash
version utilisez-vous? J'utiliseGNU bash, version 4.3.46(1)-release (x86_64-slackware-linux-gnu)
. J'ai écrit 2 scripts bash qui écrivent dans différents fichierswrite1.sh
:: pastebin.com/rbKmdWgB etwrite2.sh
: pastebin.com/bNx3VRws . Je les lance comme ça:./write1.sh ; ./write2.sh
. Le premier script résonnewrote 1
plusieurs fois, j'appuieC-z
, dit-il[1]+ Stopped ./write1.sh
et je peux immédiatement voir la sortie du deuxième script:wrote 2
répété à plusieurs reprises.command1 && command2
pipelines est qu'elleControl-z
envoie unSIGCHLD
signal au processus. Il peut être vérifié avececho $?
.Bash
voit alors que le premier processus ne s'est pas terminé avec succès et n'exécute pas les processus suivants.GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin16)
. Ouais, je pense que tu as raison.foo; bar
ne peut pas être contrôlé de la manière souhaitée. Mais nous pouvons faire l'arrêt requis du deuxième processus avecCtrl+Z
si l'exécution de la commande estfoo && bar
. Je mettrai à jour la réponse. Je vous remercie de le faire remarquer.bar
est toujours suspendu et apparaît enjobs
sortie, donc il devrait probablement être tué aussi.