다음 EXIT
과 같이 트랩을 통해 일종의 정리 코드를 실행하는 쉘 스크립트가 있다고 가정 해 봅시다 .
#!/bin/bash
mytrap () {
echo "It's a trap!" >&2
}
trap mytrap exit
echo I am at the end of the script.
It's a trap!
스크립트가 종료되면 예상대로 인쇄 됩니다.
$ sh myscript
I am at the end of the script.
It's a trap!
다음과 같이 다른 명령으로 파이프되는 출력을 생성하는 함수를 추가하도록 스크립트를 수정합니다.
#!/bin/bash
mytrap () {
echo "It's a trap!" >&2
}
myfunc () {
echo "I've got a bad feeling about this..."
}
trap mytrap exit
myfunc | cat > /dev/null
echo I am at the end of the script.
파이프로 인해 코드 입력 myfunc
은 서브 쉘에서 실행되며 서브 쉘 trap
은 부모 의 동작 을 상속하지 않는 것으로 보입니다. 즉, 여기에서 트랩 코드로 정리해야하는 작업을 수행하는 경우 발생하지 않습니다.
그래서 당신은 이것을 시도하십시오 :
myfunc () {
trap mytrap EXIT
echo "I've got a bad feeling about this..."
}
그리고 mytrap
서브 쉘이 종료 될 때 여전히 트리거되지 않습니다 . 다음 exit
과 같이 명시 적으로 필요하다는 것이 밝혀졌습니다 .
myfunc () {
trap mytrap EXIT
echo "I've got a bad feeling about this..."
exit
}
위 코드 mytrap
를 사용하면 서브 쉘에서 나올 때 적절하게 트리거됩니다.
$ sh myscript
It's a trap!
I am at the end of the script.
It's a trap!
예상되는 동작입니까? 나는 여기 여러 가지에 놀랐습니다.
trap
서브 쉘에 의해 설정이 상속되지 않았습니다- 서브 쉘에서 내재 된 종료가
EXIT
트랩 을 트리거하지 않는 것으로 보입니다.