在 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命令来删除特别的的行为(失败会导致 shell 退出等)特殊的内置函数在 POSIX shell 中,例如kshbash

所以:

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"

相关内容