[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

'foo > >(bar)' doesn't set $! for external foo not invoked via 'command'

From: Rusty Bird
Subject: 'foo > >(bar)' doesn't set $! for external foo not invoked via 'command'
Date: Sun, 19 Jul 2020 20:48:36 +0000

Configuration Information [Automatically generated, do not change]:
Machine: x86_64
OS: linux-gnu
Compiler: gcc
Compilation CFLAGS: -O2 -g -pipe -Wall -Werror=format-security 
-fstack-protector-strong -grecord-gcc-switches 
-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

        $! 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'.

        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 && ...

This only works if 'program' is changed to 'command program'.


Attachment: signature.asc
Description: PGP signature

reply via email to

[Prev in Thread] Current Thread [Next in Thread]