bash 스크립트의 경우 'Ctrl + c'를 트랩하십시오. 그러나이 스크립트에서는 프로세스가 열려 있지 않습니다.


11

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

my_program

그리고 'Ctrl + c'로 닫을 수 있기를 바랍니다. 그러나 내가 할 때 내 스크립트도 닫힙니다.

나도 알아

trap '' 2
my_program
trap 2

그러나이 경우 my_programCtrl + c로 닫을 수 없습니다 .

프로그램에서 Ctrl + c를 허용하지만 실행중인 스크립트를 닫지 않는 방법을 알고 있습니까?

편집 : 예 추가

#!/bin/bash
my_program
my_program2

내가 가까이하려면 Ctrl + C를 사용하는 경우 my_program, my_program2전체 스크립트가 종료되기 때문에 실행되지 않습니다.

답변:


13

당신은 사용해야 trap true 2또는 trap : 2대신 trap '' 2. 그것이 bash 쉘의 "help trap"에 관한 것입니다.

ARG가 널 (null) 문자열 인 경우 각 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
어떻게 살인에 대해 tail다음을들 대신 고양이를 죽이는?
kubanczyk

12

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
.
.
.

1
받아 들여진 대답은 아마도 셸에 대해 더 좋고 더 표준적일 수 있지만, 이런 종류의 신호 마스킹 / 무시를 안전하게 수행하는 방법에 대한 일반적인 원칙 (쉘에 국한되지 않음)을 소개한다는 점에서 그 자체로는 큰 대답입니다.
R .. GitHub 중지 지원 얼음

exec my_program서브 쉘에서 약간 더 효율적일 수 있다고 생각합니다 .
Toby Speight

@R .. 그것은 절대적으로 쉘에 국한되지 않습니다. 신호를 SIG_IGN (빈 문자열이있는 트랩이 수행하는 것)으로 설정하면 SIGCHLD를 제외하고 해당 상태는 exec ()를 통해 상속됩니다. POSIX 명령 동작입니다. stackoverflow.com/questions/32708086/…에
mosvy

@ mosvy : 내 의견 중 동의하지 않는 부분이 보이지 않습니다. 내 요점은 "포크 전에 마스크 / 무시, 실행 전에 아이에서 마스크 해제 / 무시"는 쉘 프로그래밍의 맥락 밖에서 아는 데 유용한 일반적인 원칙이라는 것입니다.
R .. GitHub 중지 지원 얼음

1
이것은 매우 유용한 답변입니다. 숙련 된 Linux 사용자로서, 이전에 들어 본 적이 없다고 말할 수 있습니다. 그것은 꽤 많은 용도를 가지고 있습니다 ... 당신은 내 공감과 내 북마크를 얻었습니다.
Dev

-1


Crtl+ 를 사용 하면 프로그램 C중단 됩니다 ( " kill " 프로그램 ).
당신이 찾고있는 것은 아마도 프로그램 을 일시 중지시키는 것입니다 ( " pause "it). 이를 위해 Crtl+ 를 사용할 수 있습니다 Z.
프로그램이 일시 중지되면을 사용하여 볼 수 있습니다 jobs. 예를 들면 다음
[1]+ Stopped ./foobar
과 같습니다. 작업 # 1은 하나만 있지만 둘 이상의 작업이있을 수 있습니다. 각 작업에는 고유 한 번호가 있습니다.
여러 명령 (예 bg: fg및) 을 사용하여 일시 중단 된 프로세스를 제어 할 수 있습니다 kill.
bg %1에서 작업 1을 다시 시작 B ACK g 라운드
fg %1의지 재시작의 작업 1 F의 광석g의 라운드는
kill %1작업 # 1 죽일 것이다
당신이 사용할 수있는 주 bgfg당신이 하나의 활성 작업이있는 경우 인수없이합니다.


고맙지 만 아니요, Ctrl + c를하고 싶습니다.
bob dylan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.