나는 다음을 사용하고 있습니다 :
$ 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 -u
zsh 에서 실행하면 옵션 설정 없이 zsh에서 실행 source
됩니다 ). -u
스크립트의 특정 기능에 따라 다른 차이점/예외가 있을 수 있습니다.