-T가 설정되었음에도 불구하고 bash DEBUG 트랩은 서브쉘에 의해 상속되지 않습니다.

-T가 설정되었음에도 불구하고 bash DEBUG 트랩은 서브쉘에 의해 상속되지 않습니다.

나는 다음을 사용하고 있습니다 :

$ bash --version
GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu)

반면:

#!/bin/bash
validate() {
    if [[ "$BASH_COMMAND" == whoami ]]; then
        echo "whoami detected!"
    fi
}
$ set -T
$ trap 'validate' DEBUG
$ shopt -s extdebug

그런 다음 을 쓰면 whoami"whoami 감지기"가 표시됩니다.

하지만 스크립트를 사용하는 경우:

#!/bin/bash
whoami

그리고 실행하세요:

./script.sh

메시지를 받지 못했습니다.

~에 따르면문서:

-T 설정하면 DEBUG 및 RETURN의 모든 트랩이 쉘 함수, 명령,서브쉘 환경에서 실행되는 명령. 이 경우 DEBUG 및 RETURN 트랩은 일반적으로 상속되지 않습니다.

왜 작동하지 않나요?

이는 whoami설명 목적으로만 사용됩니다.

답변1

실행 스크립트는 ./script.sh하위 쉘에서 실행되지 않지만 상위 쉘에서 쉘 상태(예: 트랩)를 상속하지 않는 새 쉘에서 실행됩니다. 이 Stackoverflow 질문에 대한 내 답변을 확인하세요."bash 스크립트는 새 셸에서 실행되나요, 아니면 하위 셸에서 실행되나요?"자세한 내용은.

서브셸에서 스크립트를 실행하려면 다음을 사용하여 ( )서브셸을 생성 source하거나 .해당 서브셸에서 스크립트를 실행할 수 있습니다.

(source script.sh)

이는 상위 셸의 컨텍스트에서 스크립트를 실행하기 때문에 일부 사항은 일반적으로 실행하는 것과 다릅니다(자체 셸을 사용하여). 우선, shebang 라인은 모든 옵션을 포함하여 무시됩니다(예를 들어 shebang 라인이 이지만 #!/bin/bash -uzsh 에서 실행하면 옵션 설정 없이 zsh에서 실행 source됩니다 ). -u스크립트의 특정 기능에 따라 다른 차이점/예외가 있을 수 있습니다.

관련 정보