ksh88에서는 다음과 같은 "dot" 명령을 사용하여 파일을 가져올 수 있습니다.
. /my/file/source.ksh
하지만 source.ksh가 존재하지 않는다면 에러를 잡아내고 싶습니다.
그래서 나는 이것을 시도했습니다 :
#!/bin/ksh
trap "echo 'Source Not Found'; exit 1" ERR
. test2.ksh
그러나 트랩은 오류 메시지를 표시하지 않으며 스크립트는 다음을 반환합니다.
./test.ksh[4]: test2.ksh: not found.
아무런 신호 없이 사용해 보았지만 trap
여전히 오류가 발생하지 않습니다.
이 오류를 잡을 수 있는 방법이 있나요? 이 스크립트에는 ksh88을 사용해야 합니다. 이 질문에는 Bash 답변이 쓸모가 없습니다.
파일이 존재하는지 미리 테스트할 수 있다는 것을 알고 있습니다. 스크립트에 이런 오류가 많기 때문에 그렇게 하지 않고도 이 오류를 잡을 수 있는 방법이 있었으면 좋겠습니다.
답변1
command
명령을 사용하여 제거할 수 있습니다 .특별한동작(실패하면 쉘이 종료되는 등)특수 내장 기능ksh
또는 와 같은 POSIX 셸에서 bash
.
그래서:
if ! command . /my/file/source.ksh; then
echo >&2 ". failed"
exit 1
fi
이제 찾을 수 없거나, 읽기 위해 열 수 없거나, 읽거나 구문 분석하는 동안 오류가 발생하거나, 마지막 명령 실행이 실패를 반환하는 .
경우 /my/file/source.ksh
실패할 수 있습니다 .
source.ksh
읽기를 열 수 없는 상황 만 고려하려는 경우 다음을 사용할 수 있습니다 exec
(다른특수 내장):
die() {
IFS=" "
printf >&2 'Error: %s\n' "$*"
exit 1
}
command exec 3< /my/file/source.ksh || die "Can't read the file"
command . /dev/fd/3
또는 eval
대신 사용하십시오 .
:
code=$(cat /my/file/source.ksh) || die "Can't read the file"
eval "$code"