在 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 答案对这个问题没用。
我知道我可以事先测试文件是否存在,我只是希望有一种方法可以捕获这个错误而不必这样做,因为我的脚本中包含了很多这样的错误。
您可以使用该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)
| 归档时间: |
|
| 查看次数: |
1957 次 |
| 最近记录: |