2012-10-07 29 views
16

estoy tratando de ejecutar comandos dentro de una secuencia de comandos utilizando la lectura, y cuando el usuario utiliza Ctrl +C, quiero detener la ejecución del comando, pero no salir de la guión. Algo como esto:BASH - usando trampa Ctrl + C

#!/bin/bash 

input=$1 
while [ "$input" != finish ] 
do 
    read -t 10 input 
    trap 'continue' 2 
    bash -c "$input" 
done 
unset input 

Cuando el usuario utiliza Ctrl +C, quiero que continúe la lectura de la entrada y la ejecución de otros comandos. El problema es que cuando se utiliza un comando como:

while (true) do echo "Hello!"; done; 

No funciona después escribo Ctrl +C una vez, pero funciona una vez que lo escribo varias veces.

+2

tratar 'trampa 'break' 2 'en su lugar –

Respuesta

8

Prueba el siguiente código:

#!/bin/bash 
# type "finish" to exit 

# function called by trap 
other_commands() { 
    printf "\rSIGINT caught  " 
    sleep 1 
    printf "\rType a command >>> " 
} 

trap 'other_commands' SIGINT 

input="[email protected]" 

while true; do 
    printf "\rType a command >>> " 
    read input 
    [[ $input == finish ]] && break 
    bash -c "$input" 
done 
+0

Ver mi edición, la prueba ahora está dentro del ciclo. –

+0

Todavía no funciona para un ctrl + C, tengo que escribirlo 3 o 4 veces para detener la impresión Hola –

+1

No te entiendo, 'ctrl + C' está atrapado como me pediste. En lugar de dejarlo, imprime algunas cadenas en 'STDOUT'. –

10

Tiene que ejecutar el comando en un grupo de procesos diferentes, y la forma más fácil de hacerlo es utilizar el control de trabajos:

#!/bin/bash 

# Enable job control 
set -m 

while : 
do 
    read -t 10 -p "input> " input 
    [[ $input == finish ]] && break 

    # set SIGINT to default action 
    trap - SIGINT 

    # Run the command in background 
    bash -c "$input" & 

    # Set our signal mask to ignore SIGINT 
    trap "" SIGINT 

    # Move the command back-into foreground 
    fg %- 

done