On Mon, Feb 26, 2018 at 02:30:15PM -0300, Lauro Costa wrote: > Subject: Unexpected(?) return value inside if-else > > The "if" on b is of course false, so it goes to the else and returns the > return value of a(). Dash will print "b() = 1" and bash will print "b() = > 0". > > If you comment out lines 6,7,8 and 10 bash and dash will print "b() = 0". > > This is just a sample code and doesn't do anything useful. And it would be > easy to workaround this issue changing the code. And I'm very likely doing > something non POSIX-compliant with return `something`. But I don't know what > it is and I'm very curious to know what is going on. Please take a look, > thank you. > ________________________ > a(){ > return `echo x |grep -q x` > } > > b(){ > if echo x |grep -q y ;then > return 100 > else > return `a` > fi > } > > a > echo "a() = $?" > b > echo "b() = $?" > _________________________ You probably misunderstood what process substitution (``) is: a simple string substitution. In your examples all it does is execute a command but substitute nothing. Your examples reduce to: $ dash -c 'b() { false; `true` return; }; b; echo $?' 1 $ bash -c 'b() { false; `true` return; }; b; echo $?' 0 Without process substitution both shells return 1: $ dash -c 'b() { false; return; }; b; echo $?' 1 $ bash -c 'b() { false; return; }; b; echo $?' 1 What happens is that bash returns the return value of the process substitution on the return command and dash the return value of the last command. I do not know if there is a specification mandating one or the other behaviour but that's bash's behaviour that I find surprising. -- To unsubscribe from this list: send the line "unsubscribe dash" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html