KSH에서 도트(.) 파일을 찾을 수 없는 오류를 포착하는 중입니다.

KSH에서 도트(.) 파일을 찾을 수 없는 오류를 포착하는 중입니다.

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"

관련 정보