Bash에서 '-c' 매개변수를 통해 여러 명령을 사용하면 이상한 신호 동작이 발생합니까?

Bash에서 '-c' 매개변수를 통해 여러 명령을 사용하면 이상한 신호 동작이 발생합니까?
bash -c "sleep 5; echo 'test'"

위의 명령을 실행하고 CTRL-C를 누르면 sleep 5전체 프로세스가 종료되고 echo 'test'표시되지 않습니다.

위 명령을 실행하고 sleep명령 처리 SIGINT( CTRL-C)를 허용하려면 어떻게 해야 합니까?

SIGINT내부 명령이 아닌 bash 프로세스 인 것 같아요 ?

답변1

bashsleep(및 기타 쉘)은 작업 제어 없이 스크립트를 실행하므로 ^C는 (모두 동일한 포그라운드 프로세스 그룹의 일부이기 때문에) 뿐만 아니라 전체 스크립트를 종료합니다 .

스크립트에서 다음 명령을 사용하여 작업 제어를 활성화해야 합니다 set -m.

$ bash -c 'set -m; sleep 5; echo test'
^Ctest
$

또는잡다SIGINT스크립트의 신호:

$ bash -c 'trap : SIGINT; sleep 5; echo test'
^Ctest
$

:대신 참고 ''하세요.소홀히 하다, 해당 하위 프로세스는 SIGINT이 구성을 상속하고 무시합니다.

SIGINT가 내부 명령이 아닌 bash 프로세스로 들어갈 것 같아요?

두 가지 모두에 전송됩니다. 하나의 VINTR문자( ^C기본적으로)는 SIGINT포그라운드 작업(프로세스 그룹)에서 모든 프로세스로 신호를 보냅니다.

관련 정보