답변:
당신이 키를 누르면 Ctrl+ C는 SIGINT
신호 전체에 전달되는 전경 프로세스 그룹 . 여기서는 find
프로세스와 호출 셸 프로세스 모두로 전송됩니다 . find
즉시 종료하여 반응하고 쉘은 트랩을 호출하여 반응합니다.
트랩의 코드가 반환되면 (즉 exit
, 호출하지 않음 ) 신호에 의해 중단 된 명령 다음에 명령이 실행됩니다. 여기에서 find
명령이 스크립트의 끝에 도달하면 스크립트는 즉시 종료됩니다. 그러나 다른 명령을 추가하여 0과 1을 입력하는 것의 차이점을 볼 수 있습니다.
find /
echo "find returned $?"
당신이 원하는 것을 할 수 있습니다; 그러나 내 대답 의이 부분은 실제 문제를 해결하는 것보다 쉘 프로그래밍을 발견하는 것에 관한 것입니다.
당신이 살인을 피하려면 find
, 당신은 그것을 시작하는 데 필요한 배경 : find / &
. 그런 다음 wait
내장 을 사용하여 정상적으로 종료 될 때까지 기다리십시오. 신호는 wait
내장 신호를 차단하며 전파하려는 신호를 수신 할 때까지 루프에서 실행할 수 있습니다. 그런 다음 kill
작업을 종료 하는 데 사용 하십시오.
hell () {
echo "Do you want to quit? Press 1 for yes and 0 for no"
read n
if [ "$n" = 1 ]; then
# Kill the job if it's running, then exit
if [ -n "$job_pid" ]; then kill $job_pid; fi
exit 1
fi
}
job_pid=
trap "hell" SIGINT
# Start a demo job in the background
for i in 1 2 3 4 5; do date; sleep 1; done &
job_pid=$!
# Call wait in a loop; wait will return 0 if the job exits, and 128+$signum if interrupted by a signal.
while ! wait; do
echo "resuming wait"
done
job_pid=
echo last exit code: $?
셸에서이 방법에는 제한이 있습니다.
job_pid=
$jobpid
wait
SIGCHLD
wait $job_pid
양식 을 사용해야합니다 . 그러나 " wait
신호에 의해 중단되었습니다"와 "작업이 신호에 의해 종료되었습니다"( "반환 상태가 ≥128 인 자체 작업으로 종료 됨") 와 구별 할 수 는 없지만 셸의 일반적인 사실입니다. 프로그램 작성).이러한 한계를 극복하려면 Perl 또는 Python과 같은 더 멋진 언어를 사용하십시오.