2012-10-07 2 views
16

나는 읽기를 사용하여 스크립트 내에서 명령을 실행하기 위해 노력하고있어, 사용자가 Ctrl 키 + C를 사용할 때, 나는 명령의 실행을 중지하려면,하지만 종료하지 스크립트. 이 같은 뭔가 :BASH - 사용 트랩 Ctrl + C

#!/bin/bash 

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

사용자가 Ctrl 키 + C를 사용하여, 나는 그것이 입력을 읽고 다른 명령을 계속 실행합니다. 문제는 그 나는 같은 명령을 사용할 때 :

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

내가 Ctrl 키 + C 한 시간을 입력 한 후 그것은 작동하지 않습니다,하지만 난 그것을 여러 번 입력하면 작동. 당신은 다른 프로세스 그룹의 명령을 실행해야

#!/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 
+2

하는'트랩 시도를 '휴식'2 대신 –

답변

8

다음 코드를 시도

#!/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 
+0

내 편집을 참조하십시오, 이제 테스트 루프 안에 있습니다. –

+0

여전히 Ctrl + C를 하나만 작동하지 않습니다. 인쇄를 멈추기 위해 3 ~ 4 번 입력해야합니다. 안녕 –

+1

나는 당신을 얻지 못한다. 당신이 묻는 것처럼'ctrl + C'가 갇혀있다. 종료하는 대신'STDOUT'에 문자열을 출력합니다. –

10

, 그 일을 가장 쉬운 방법은 작업 제어를 사용하는 것입니다 :