(Composed using 'bashbug')
From: yesxo...@protonmail.ch
To: bug-bash@gnu.org
Subject: in-line calls to functions cause "exit" in the function to act like 
"return"

Configuration Information [Automatically generated, do not change]:
Machine: x86_64
OS: linux-gnu
Compiler: gcc
Compilation CFLAGS: -O2 -g -pipe -Wall -Werror=format-security 
-Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions 
-fstack-protector-strong -grecord-gcc-switches 
-specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 
-specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic 
-fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection 
-Wno-parentheses -Wno-format-security
uname output: Linux 523x.env.dtu.dk 5.11.22-100.fc32.x86_64 #1 SMP Wed May 19 
18:58:25 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
Machine Type: x86_64-redhat-linux-gnu

Bash Version: 5.0
Patch Level: 17
Release Status: release

Description:

When 'exit' is executed in a function called to "in-line" its output to stdout, 
the 'exit' acts like return, leaving the function scope, but not terminating 
the bash process.

Repeat-By:

Sample script:

#!/bin/bash

set -x

function bar()
{
    exit 1
}

foo="$(bar)"
exit 0

Running:

$ ./foo.sh 
++ bar
++ exit 1
+ foo=
+ exit 0
$ echo $?
0

The call of 'exit 1' in 'function bar' "should" cause the bash process to 
terminate and declare its exit status as 1 to the kernel, unless my 
understanding of bash(1) and its relation with the kernel is mistaken.

Fix:

I have to work around by doing more checks in calling functions.  But, I've 
only seen this in that "in-lining" mechanism, thus, that seems to be where the 
problem lies.

The "fix" is for exit to do its job, irrespective of the function depth.

If I have seriously misunderstood things, I apologise for wasting your time.

I love bash(1), and thank all who have worked upon it.

Warm regards,

 YesXorNo

Reply via email to