Armadilha 'Ctrl + c' para script bash mas não para processo aberto neste script

11

Eu tentei ter um programa interativo em um script bash:

my_program

E gostaria de poder fechá-lo com "Ctrl + c". Mas quando faço isso, meu roteiro está se fechando também.

Eu sei sobre isso.

trap '' 2
my_program
trap 2

Mas, neste caso, não consigo fechar my_program com Ctrl + c.

Você tem alguma idéia de como permitir Ctrl + c em um programa, mas não fechar o script que o está executando?

EDIT: adicione exemplo

#!/bin/bash
my_program
my_program2

Se eu usar Ctrl + c para fechar my_program , my_program2 nunca será executado porque o script inteiro será encerrado.

    
por bob dylan 10.09.2018 / 13:48

3 respostas

13

Você deve usar trap true 2 ou trap : 2 em vez de trap '' 2 . Isso é o que "ajuda armadilha" em um bash shell diz sobre isso:

If ARG is the null string each SIGNAL_SPEC is ignored by the shell and by the commands it invokes.

Exemplo:

$ cat /tmp/test
#! /bin/sh
trap : INT
cat
echo first cat killed
cat
echo second cat killed
echo done
$ /tmp/test
   <press control-C>
^Cfirst cat killed
   <press control-C>
^Csecond cat killed
done
    
por 10.09.2018 / 15:52
12

Você pode redefinir uma armadilha para seu padrão, fornecendo o comando trap - como seu argumento de ação. Se você fizer isso em uma sub-sela , ela não afetará a armadilha no pai Concha. Em seu script, você pode fazer isso para cada comando que precisa ser interrompível com Ctrl-C:

#!/bin/bash
# make the shell (and its children) ignore SIGINT
trap '' INT
.
.
.
# but this child won't ignore SIGINT
(trap - INT; my_program)
# the rest of the script is still ignoring SIGINT
.
.
.
    
por 10.09.2018 / 16:20
-1


Quando você usa Crtl + C , você interrompe o programa (" mata "). br> O que você provavelmente está procurando é suspender seu programa (" pausar "). Para isso, você pode usar Crtl + Z .
Quando seu programa estiver pausado, você poderá vê-lo usando jobs . Por exemplo:
[1]+ Stopped ./foobar
Aqui eu só tenho um emprego, o trabalho # 1, mas pode haver mais de um - cada trabalho tem seu próprio número.
Você pode controlar seu processo suspenso usando vários comandos, por exemplo bg , fg e kill .
bg %1 reiniciará o trabalho nº 1 no b ack g rodada
fg %1 irá reiniciar o trabalho # 1 no f ore g rodada
kill %1 irá matar o trabalho # 1 < br> Observe que você pode usar bg e fg sem argumentos se tiver apenas um trabalho ativo.
Espero que isso ajude.

    
por 10.09.2018 / 14:38

Tags