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
서브쉘의 암시적 종료가 트랩을 트리거하지 않는 것 같습니다.