bash 스크립트에서 대화 형 프로그램을 만들려고했습니다.
my_program
그리고 ‘Ctrl + c’로 닫을 수 있기를 바랍니다. 그러나 내가 할 때 내 스크립트도 닫힙니다.
나도 알아
trap '' 2
my_program
trap 2
그러나이 경우 my_program
Ctrl + c로 닫을 수 없습니다 .
프로그램에서 Ctrl + c를 허용하지만 실행중인 스크립트를 닫지 않는 방법을 알고 있습니까?
편집 : 예 추가
#!/bin/bash
my_program
my_program2
내가 가까이하려면 Ctrl + C를 사용하는 경우 my_program
, my_program2
전체 스크립트가 종료되기 때문에 실행되지 않습니다.
답변
당신은 사용해야 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
답변
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
.
.
.
답변
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 죽일 것이다
당신이 사용할 수있는 주 bg
와 fg
당신이 하나의 활성 작업이있는 경우 인수없이합니다.