在 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 中,例如ksh
或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"