쉘 스크립트의 트랩 처리 및 암시적 하위 쉘

쉘 스크립트의 트랩 처리 및 암시적 하위 쉘

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

답변1

bash trap내장을 사용하면 키워드를 사용할 수 있습니다 RETURN.

trap mytrap EXIT

도착하다:

trap mytrap RETURN

trap보다쉘 내장 함수

관련 정보