구성 파일이 "정리"되어 가져오기 안전한지 확인하는 간단한 함수를 작성하려고 합니다. 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}"
%
또한 예를 들어 return
or exit
문을 trap
로 바꾸면 매번 echo
해당 문이 실행되는 것을 볼 수 있습니다 .trap
그렇다면 왜 이 동작은 에서만 관찰 ksh
되고 에서는 관찰되지 않습니까 bash
? 근본 원인은 무엇이며 해결 방법은 무엇입니까?