19 Temmuz 2020 Pazar tarihinde Rusty Bird <rustyb...@net-c.com> yazdı:
> 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 [...] 4.19.132-1.pvops.qubes.x86_64 #1 SMP Tue Jul 14 > 03:42:21 UTC 2020 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: > $! isn't set to the PID of 'bar' for > > foo > >(bar) > > if 'foo' is an external program (as opposed to a builtin or > function) - unless it's invoked via 'command'. > > Repeat-By: > type date # "date is /usr/bin/date" > set -u > echo $! # "bash: $!: unbound variable" > > date > >(sleep 20) > echo $! # "bash: $!: unbound variable" > > command date > >(sleep 21) > echo $! # "123" > > date_wrapper() { date; } > date_wrapper > >(sleep 22) > echo $! # "234" > > > For context - I'm filtering a program's stdout and stderr > (separately), requiring successful exit statuses for the program and > both filters: > > set -u -o pipefail > { program 2> >(stderr_filter >&2) && wait $!; } | stdout_filter && > ... > Not sure if process substitution is really necessary here, set -u -o pipefail { program 2>&3 | stdout_filter; } 3>&1 | stderr_filter && ... does the same thing. > This only works if 'program' is changed to 'command program'. > > Rusty > -- Oğuz