Bash:如果子函数失败,如何从父函数返回?

时间:2018-04-10 07:36:24

标签: bash shell sh

我想清理一些代码,因为我想清理每个命令后的检查返回代码状态检查。如果命令失败,我将mid函数返回到父函数。 如果我将这个代码放在一个函数中,那么没有任何反应,因为return命令将在new-child函数中。

确实有些想法。

现状:

a(){
    for i in $(cat file.txt)
    do
        scp $i hostb:/tmp/

        if [ $? -ne 0 ]
        then
            print_failed "SCP failed."
            return 1
        fi
    done
}

所需:

a(){
    for i in $(cat file.txt)
    do
        scp $i hostb:/tmp/

        # continue as usuall unless return code is not 0
        check_status $?
    done
}

check_status(){
    if [ $1 -ne 0 ]
    then
        print_failed "SCP failed."
        return 1
    fi
}

1 个答案:

答案 0 :(得分:2)

据我所知,如果子函数失败,则没有隐式方式从父函数返回。

我能想到的最接近的事情就是这样:

a () {
    while read -r source    # don't read lines with "for"!
    do
        check_status scp "$source" hostb:/tmp/ || return 1
    done < file.txt
}

check_status () {
    if ! "$@"
    then
        print_failed "SCP failed."
        return 1
    fi
}

check_status的作用是执行命令并在失败消息失败时打印失败消息。它还返回1,因此父函数也可以使用if !||返回。

除了使用全局变量之外,没有办法从父函数返回,如果可能的话,我个人会避免使用它。

说实话,我没有看到你对此有什么好处:

a () {
    while read -r source
    do
        if ! scp "$source" hostb:/tmp/
        then
            print_failed "SCP failed."
            return 1
        fi
    done < file.txt
}