Is there a way to write a bash function which aborts the whole execution, no matter how it is called?

前端 未结 5 679
悲&欢浪女
悲&欢浪女 2020-11-29 18:19

I was using \"exit 1\" statement in my bash functions to terminate the whole script and it worked fine:

function func()
{
   echo \"Goodbye\"
   exit 1
}
ech         


        
相关标签:
5条回答
  • 2020-11-29 18:43

    What you could do, is register the top level shell for the TERM signal to exit, and then send a TERM to the top level shell:

    #!/bin/bash
    trap "exit 1" TERM
    export TOP_PID=$$
    
    function func()
    {
       echo "Goodbye"
       kill -s TERM $TOP_PID
    }
    
    echo "Function call will abort"
    echo $(func)
    echo "This will never be printed"
    

    So, your function sends a TERM signal back to the top level shell, which is caught and handled using the provided command, in this case, "exit 1".

    0 讨论(0)
  • 2020-11-29 18:45

    You can use set -e which exits if a command exits with a non-zero status:

    set -e 
    func
    set +e
    

    Or grab the return value:

    (func) || exit $?
    
    0 讨论(0)
  • 2020-11-29 18:57

    I guess better is

    #!/bin/bash
    set -e
    trap "exit 1" ERR
    
    myfunc() {
         set -x # OPTIONAL TO SHOW ERROR
         echo "Exit with failure"
         set +x # OPTIONAL
         exit 1
    }
    echo "BEFORE..."
    myvar="$(myfunc)"
    echo "AFTER..But not shown"
    
    0 讨论(0)
  • 2020-11-29 18:57

    A child process can't force the parent process to close implicitly. You need to use some kind of signaling mechanism. Options might include a special return value, or perhaps sending some signal with kill, something like

    function child() {
        local parent_pid="$1"
        local other="$2"
        ...
        if [[ $failed ]]; then
            kill -QUIT "$parent_pid"
        fi
    }
    
    0 讨论(0)
  • 2020-11-29 18:57

    But is there a way to write a function which aborts the whole execution, no matter how it is called?

    No.

    I just need to get the real return value (echoed by the function).

    You can

    res=$(func)
    echo $?
    
    0 讨论(0)
提交回复
热议问题