linux - 尝试使用 trap 跳出 shell 函数

标签 linux bash shell

我正在尝试编写一个 shell 函数,如果其中发生错误(特别是当被调用的命令返回错误时),它将退出该函数(而不是脚本),并将错误代码返回给调用函数。

例如,对于脚本:

#!/bin/sh
on_error() {
    return 1
}

f() {
    echo 'function f'
    g
    echo "g returned $?"
}

g() {
    trap on_error ERR
    echo 'function g'
    false
    echo "boo"
}

f

我回来了:

$ ./cc
function f
function g
boo
g returned 0

当我想回来的时候:

$ ./cc
function f
function g
g returned 1

我需要做什么才能得到这个?

如果我将 on_error 函数更改为退出 1,例如:

on_error() {
    return 1
}

然后我得到:

$ ./cc
function f
function g

指示整个脚本在遇到“false”命令时退出。

虽然在这个示例中可以简单地检查 g 中命令的错误代码并在其中一个失败时返回错误,但在我的实际情况中,我想要一个测试函数来尝试复制一打或更多文件从不同位置到不同目的地,并在其中一个文件第一次失败时停止,以便我可以报告测试失败并继续下一个测试功能。

虽然我更喜欢/bin/sh 解决方案,但/bin/bash 也不错。

最佳答案

这是你想要的吗? (仅限 Bash。)

#!/bin/bash

f() {
    echo 'function f'
    g
    echo "g returned $?"
}

g() {
    trap 'return 1' ERR
    echo 'function g'
    false
    echo "boo"
}

f

关于linux - 尝试使用 trap 跳出 shell 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38772496/

相关文章:

git - 制作一个 shell 脚本来更新 3 个 git repos

c++ - Visual Studio 2015/Linux 扩展使用 Cygwin 生成 "collect2 : error : ld returned 1 exit status"

bash - Crontab 不工作(已完成标准故障排除)

bash - 64 位 Ubuntu 上的脚本问题

python - Bash + Python 中的 EoF/Ctrl+D 命令

bash - 在 shell 脚本变量中执行 bash 命令时出错

linux - 如何等待命令的特定输出字符串并执行另一个命令

c - 什么是 DDD(数据显示调试器)的良好 unix 替代品?

linux - crontab 中的方括号和 -x

linux - 重击 :/proc/sys/vm/drop_caches: Permission denied