3

According to the Open Group,

[t]he return utility shall cause the shell to stop executing the current function or dot script. If the shell is not currently executing a function or dot script, the results are unspecified.

However, if you run the following snippet

func () {
    ( return 1 )
    return 0
}
func
echo $?

the output is 0 (I tried bash and dash, with the same result). So, it seems that return does not cause the shell to stop executing the current function, which would contradict the POSIX standard. Am I missing something?

7
( return 1 )

This runs in a subshell. It does terminate the subshell immediately, and if you caught that shell's return code, it would be 1. The function itself returns 0 on the line after that.

(See Grouping Commands in the Shell Command Language specification.)

Compare with the {} form that doesn't introduce a subshell:

#! /bin/sh

func () {
    ( return 42 )
    echo "One:   $?"
    { return 1; }
    echo "Two:   $?"
    return 2
}

func
echo "Three: $?"

Output (note the absence of "Two"):

One:   42
Three: 1
  • Correct, however sometimes it's not obvious that return is executed in a sub-shell, for example if it's inside a while loop that reads input from a pipe. From the POSIX spec, I would have expected return to exit the function even if the return itself is executed in a sub-shell. – Ernest A C Sep 30 '12 at 14:24
  • 1
    There is absolutely no way for separate shell processes to communicate in the way you're describing. The only information returned to the shell from a subprocess are an exit code and the contents of standard output if you choose to capture it. – jgoldschrafe Sep 30 '12 at 16:13

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.