ksh93의 DEBUG 트랩 문에 종료 또는 반환 문이 포함된 경우 첫 번째 실행 이후에는 실행되지 않습니다.

ksh93의 DEBUG 트랩 문에 종료 또는 반환 문이 포함된 경우 첫 번째 실행 이후에는 실행되지 않습니다.

구성 파일이 "정리"되어 가져오기 안전한지 확인하는 간단한 함수를 작성하려고 합니다. bash함수를 처음 호출할 때만 , 및 (버전 ABIJM 93v-2014-06-25)에서만 작동 하는 것 같습니다 . ksh다음은 여전히 ​​오류를 재현하는 함수의 축소 버전입니다.

function sanitized_source
{ 
    typeset source_filename=$1
    (
        #shopt -s extdebug # Need this if using bash
        trap 'if [[ $? != 0 ]]; then return 66; fi' DEBUG
        PATH=.
        set -re
        . "${source_filename}"
    )
}

및 구성 파일:

cd /root || echo 'what?'
echo 'why is this executed?'

실행 방법과 표시되는 내용:

% . ./dotfile
% sanitized_source test.conf
ksh: sanitized_source[79]: sanitized_source[1]: cd: restricted
% sanitized_source test.conf
ksh: sanitized_source[79]: .[1]: cd: restricted
what?
why is this executed?

그 목적 은 명령이 실패하더라도 쉘이 종료되지 않는 상황을 trap다루는 것입니다 . set -e에서 man bash:

[설정]-e

[...] 실패한 명령이 && 또는 || 내에서 실행되는 명령의 일부인 경우 마지막 && 또는 || 다음에 나열된 명령을 제외하고 쉘은 종료되지 않습니다.

외부 디버깅

[...] 2. DEBUG 트랩에 의해 실행된 명령이 0이 아닌 값을 반환하면 다음 명령을 건너뛰고 실행되지 않습니다.

첫 번째 호출과 두 번째 호출 사이에 매개변수가 .sh.command변경된 것을 확인했습니다 ..sh.subshell

% sanitized_source test.conf
ksh: sanitized_source[9]: sanitized_source[1]: cd: restricted
% echo "${.sh.command}"
echo 'what?'
% echo "${.sh.subshell}"
0
% sanitized_source test.conf
ksh: sanitized_source[9]: .[1]: cd: restricted
what?
why is this executed?
% echo "${.sh.command}"     
`���2
% echo "${.sh.subshell}"    

%

또한 예를 들어 returnor exit문을 trap로 바꾸면 매번 echo해당 문이 실행되는 것을 볼 수 있습니다 .trap

그렇다면 왜 이 동작은 에서만 관찰 ksh되고 에서는 관찰되지 않습니까 bash? 근본 원인은 무엇이며 해결 방법은 무엇입니까?

관련 정보