Bash 스크립트에 대해 "Ctrl + c"를 캡처하지만 이 스크립트 내에서 열린 프로세스에 대해서는 캡처하지 않습니다.

Bash 스크립트에 대해 "Ctrl + c"를 캡처하지만 이 스크립트 내에서 열린 프로세스에 대해서는 캡처하지 않습니다.

Bash 스크립트에서 대화형 프로그램을 만들려고 합니다.

my_program

"Ctrl+c"로 닫고 싶습니다. 하지만 이렇게 하면 스크립트도 닫힙니다.

알아요.

trap '' 2
my_program
trap 2

my_program하지만 이 경우에는 Ctrl+c로 닫을 수 없습니다 .

프로그램에서 Ctrl+C를 허용하지만 이를 실행하는 스크립트를 닫지 않는 방법을 알고 계십니까?

편집: 예를 추가했습니다.

#!/bin/bash
my_program
my_program2

my_programCtrl+ c 를 사용하여 닫으면 my_program2전체 스크립트가 종료되므로 실행되지 않습니다.

답변1

대신 trap true 2or 를 사용해야 합니다 . 이것은 bash 쉘의 "도움말 트랩"에 나와 있습니다.trap : 2trap '' 2

ARG가 빈 문자열인 경우 쉘은 각 SIGNAL_SPEC를 무시합니다.그것을 통해 명령을 호출하십시오.

예:

$ 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

답변2

-Trap 명령을 작업 매개변수로 전달하여 트랩을 기본값으로 재설정할 수 있습니다. 당신이에 있다면서브쉘, 상위 쉘의 트랩에는 영향을 주지 않습니다. 스크립트에서는 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
.
.
.

답변3


Crtl+ 를 C사용 하면방해하다프로그램("죽이다"it).
당신이 찾고 있는 것은정지시키다귀하의 프로그램("정지시키다" it). 이렇게 하려면 Crtl+ 를 사용할 수 있습니다 Z.
프로그램이 일시 중지되면 다음 을 jobs사용 볼 수 있습니다 . 정지된 프로세스를 제어하는 ​​데 사용할 수 있는 명령이 많이 있으며 작업 #1을 다시 시작합니다.
[1]+ Stopped ./foobar

bgfgkill
bg %1확인하다G라운드가
fg %1작업 #1을 다시 시작합니다.에프광석G라운드는
kill %1작업 #1을 종료합니다. 활성 작업이 하나만 있는 경우 및 매개변수 없이
사용할 수 있습니다 .bgfg

관련 정보