在 KSH 中找不到陷印点 (.) 文件错误

N W*_*est 4 ksh

在 ksh88 中,我可以使用“dot”命令获取文件,例如

. /my/file/source.ksh
Run Code Online (Sandbox Code Playgroud)

但是,如果 source.ksh 不存在,我想捕获错误。

所以我试过这个:

#!/bin/ksh

trap "echo 'Source Not Found'; exit 1" ERR
. test2.ksh
Run Code Online (Sandbox Code Playgroud)

但是陷阱从不显示错误消息,脚本返回:

./test.ksh[4]: test2.ksh:  not found.
Run Code Online (Sandbox Code Playgroud)

我什至尝试在trap没有任何信号的情况下使用它仍然没有发现错误。

有没有办法捕捉这个错误?对于这个脚本,我必须使用 ksh88。Bash 答案对这个问题没用。

我知道我可以事先测试文件是否存在,我只是希望有一种方法可以捕获这个错误而不必这样做,因为我的脚本中包含了很多这样的错误。

Sté*_*las 5

您可以使用该command命令来删除POSIX shell 中的特殊内置函数(例如或)的特殊行为(因此失败会导致 shell 退出等)。kshbash

所以:

if ! command . /my/file/source.ksh; then
  echo >&2 ". failed"
  exit 1
fi
Run Code Online (Sandbox Code Playgroud)

现在,.如果/my/file/source.ksh找不到,或者无法打开读取,或者读取或解析它时出错,或者在其中运行的最后一个命令返回失败,则可能会失败。

如果只想考虑source.ksh无法打开读取的情况,可以使用exec(另一个特殊的 builtin):

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
Run Code Online (Sandbox Code Playgroud)

或使用eval代替.

code=$(cat /my/file/source.ksh) || die "Can't read the file"
eval "$code"
Run Code Online (Sandbox Code Playgroud)