bash 함수에서 트랩을 설정하는 방법은 무엇입니까?


13

trapbash 스크립트에서는 설정할 수 있지만 bash 함수 는 설정할 수 없습니다.

예를 들어, source아래 코드를 실행 f하고 이제 Ctrl+를 시도 C하면 갇히지 않았습니다!

trapbash 함수에서 설정하는 방법 ?

  4 trap ctrl_c INT
  5 
  6 ctrl_c () {
  7  echo "** Trapped CTRL-C"
  8 }
  9 
 10 
 11 f () {
 12   for i in `seq 1 100`; do
 13     sleep 1
 14     echo -n "."
 15   done
 16 } 

2
f코드 끝에를 넣고 에 공백을 제거 할 수 있습니다 f ().
GWF

답변:


7

왜냐하면 bash스크립트를 실행하는 대신 SIGINT를 포 그라운드의 프로세스로 전송하기 때문 입니다. 이 작업을 수행하려면 함수를 비동기로 만든 다음 사용하십시오 wait(예상대로 작동하고 트랩을 사용함).


그것은 일종의 작품입니다. 그러나 f파이프에 있으면 echo 123 | f트래핑되지 않는다는 것을 알았 습니다.
Cheng

@Cheng 서브 쉘을 사용하십시오 (이 경우 파이프는 불필요합니다. heredoc / herestring을 사용하십시오). (command | command) &
Chris Down

1

Protip : 프로세스 A가와 QUIT 전경을 보내기 Ctrl- \Ctrl- C, -Z , - D작동하지 않습니다.

실행 종료시 트랩 제거 trap - list of signals here

비 프로덕션 시스템에서의 재미 : 모든 합리적인 신호 (예 : KILL 아님)에 대한 트랩을 설정하십시오. kill -l(이것은 소문자 L이 숫자 1이 아니거나 파이프 |가 아닙니다)


0

함수를 전역으로 만들어야한다고 생각합니다.

#!/bin/bash
trap ctrl_c INT
ctrl_c () {
  echo "** Trapped CTRL-C"
} 
for i in `seq 1 100`; do
  sleep 1
  echo -n "."
done

INTSIGINT동의어입니다 - 그것은 마찬가지입니다.
Chris Down
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.