Comment puis-je annuler le reste d'une liste de commandes dans Bash?

10

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

fooest une commande de longue durée qu'il est très important de ne pas interrompre, et barfait quelque chose d'irréversible et indésirable (par exemple, shutdown -h nowou rm -rf /). Pendant qu'il fooest toujours en cours d'exécution, existe-t-il un moyen général de dire au shell de laisser foofinir mais de ne pas courir baraprès? (Oui, je pourrais modifier les autorisations barafin qu'il ne soit pas exécutable, mais ce n'est pas particulièrement pratique si je souhaite utiliser barquelque chose comme rmça en attendant, et cela ne fonctionnera pas si je ne suis pas propriétaire barou s'il bars'agit d'un module intégré.)

Psychonaut
la source
Vous pouvez modifier la dernière barcommande pour some_command: ^bar^some_commandavant d'être exécutée.
GAD3R
3
@ GAD3R: mais cela ne modifiera pas la ligne actuelle, il en commencera une nouvelle.
Arkadiusz Drabczyk

Réponses:

3

J'ai observé que l'utilisation CtrlZpour déplacer le programme vers un processus d'arrière-plan fait l'affaire.

foo && bar

Merci à @Arkadiusz Drabczyk de l'avoir pointé dans des commentaires qui foo; barne donnent pas le contrôle de la manière requise.

Ensuite:

^Z

[1]+  Stopped                 foo

La commande arrête uniquement la première tâche et

fg %1

Cela met uniquement la tâche fooau 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.

Revanth Chetluru
la source
1
Je ne peux pas le reproduire. Quelle bashversion utilisez-vous? J'utilise GNU bash, version 4.3.46(1)-release (x86_64-slackware-linux-gnu). J'ai écrit 2 scripts bash qui écrivent dans différents fichiers write1.sh:: pastebin.com/rbKmdWgB et write2.sh: pastebin.com/bNx3VRws . Je les lance comme ça: ./write1.sh ; ./write2.sh. Le premier script résonne wrote 1plusieurs fois, j'appuie C-z, dit-il [1]+ Stopped ./write1.shet je peux immédiatement voir la sortie du deuxième script: wrote 2répété à plusieurs reprises.
Arkadiusz Drabczyk
2
Je pense que la raison pour laquelle cette méthode fonctionne avec les command1 && command2pipelines est qu'elle Control-zenvoie un SIGCHLDsignal au processus. Il peut être vérifié avec echo $?. Bashvoit alors que le premier processus ne s'est pas terminé avec succès et n'exécute pas les processus suivants.
Arkadiusz Drabczyk
J'utilise GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin16). Ouais, je pense que tu as raison. foo; barne peut pas être contrôlé de la manière souhaitée. Mais nous pouvons faire l'arrêt requis du deuxième processus avec Ctrl+Zsi l'exécution de la commande est foo && bar. Je mettrai à jour la réponse. Je vous remercie de le faire remarquer.
Revanth Chetluru
@ArkadiuszDrabczyk n'envoie pas Ctrl-Z SIGTSTP?
muru
@RevanthChetluru note qu'il barest toujours suspendu et apparaît en jobssortie, donc il devrait probablement être tué aussi.
muru le