Configuration Information [Automatically generated, do not change]:
Machine: x86_64
OS: linux-gnu
Compiler: gcc
Compilation CFLAGS: -g -O2 -fdebug-prefix-map=/build/bash-Dl674z/bash-5.0=.
-fstack-protector-strong -Wformat -Werror=format-security -Wall
-Wno-parentheses -Wno-format-security
uname output: Linux cbb62a3d8393 4.15.0-50-generic #54-Ubuntu SMP Mon May 6
18:46:08 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
Machine Type: x86_64-pc-linux-gnu
Bash Version: 5.0
Patch Level: 3
Release Status: release
Description:
Since bash 5.0, a subshell can get stuck (wait forever) in
what looks like a pretty specific set of circumstances,
namely when combining a group command or a function call
with process substitution and attempting to `wait` for said
group command or function from within a trap.
I ran a git bisect to pinpoint when exactly the regression
was introduced and it looks like it happened in [1].
[1] d233b485 (tag: bash-5.0) bash-5.0 distribution sources and
documentation
Repeat-By:
$ cat <<'EOF' | bash
(
trap 'wait' EXIT
{ sleep 2; } > >(cat)
) &
sleep 1
kill $!
wait
EOF
<ctrl-C after a few seconds of waiting>
# The process is actually still alive, even after ctrl-C...
$ pstree -p
sh(1)-+-bash(6)---pstree(321)
`-bash(316)---bash(318)---cat(320)
Replacing `{ sleep 2; }` above with `f() { sleep 2; }; f`
gives the same result. On the other hand, replacing it with
plain `sleep 2`, or `(sleep 2)` eliminates the problem.
--
mwnx
GPG: AEC9 554B 07BD F60D 75A3 AF6A 44E8 E4D4 0312 C726
ipfs.io/ipfs/QmV4tMgNmqewgcPgX4ktAbrA9jHeiM2DhEFSB4BKxwj75c