将 STDOUT 分配给变量时的 Shell 脚本错误处理

将 STDOUT 分配给变量时的 Shell 脚本错误处理

我正在尝试在我的 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 。mktmptrytry

要使子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

相关内容