쉘 스크립트에서 트랩 처리 및 암시 적 서브 쉘


12

다음 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 트랩 을 트리거하지 않는 것으로 보입니다.

답변:


8

bash trap내장은 키워드를 허용합니다 RETURN. 따라서 변경 :

trap mytrap EXIT

에:

trap mytrap RETURN

쉘 내장trap 에서 토론을보십시오

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