我正在尝试在我的 shell 脚本中实现错误处理,如第二个答案中所述使用 $ 的最佳实践?在bash中?
我的脚本如下所示:
#!/bin/bash
try() {
"$@"
code=$?
if [ $code -ne 0 ]
then
echo "oops $1 didn't work"
exit 1
fi
}
try myvar=$(mktemp -p ./)
脚本退出时带有
./test.sh: line 4: myvar=./tmp.scNLzO1DDi: No such file or directory
oops myvar=./tmp.scNLzO1DDi didn't work
只是,
myvar=$(mktemp -p ./)
当然工作正常,$myvar 返回临时文件的完整路径和名称。
如何获得将 tmp 文件的名称分配给变量 myvar 的语句,同时仍将整个语句及其结果传递给 try() 以便 try() 可以执行所需的操作?谢谢。
答案1
使用时,在构建 的参数列表期间,调用之前会执行try myvar=$(mktemp -p ./)
带有 的子 shell 。mktmp
try
try
要使子shell稍后扩展,您需要引用以下参数try
:
try 'myvar=$(mktemp -p ./)'
要稍后进行扩展,您需要使用eval "$@"
而不是"$@"
第一行中的try
。
答案2
我认为你想使用错误陷阱而不是评估的包装器。
err_handler () {
code=$?
if [ $code -ne 0 ]
then
echo "oops $1 didn't work"
exit 1
fi
}
trap 'err_handler' ERR
myvar=$(mktemp -p ./)
trap ERR