Kill the parent of a child pipe process
Enclose your command with parentheses:
( tail -f z | grep 'd' ) & kill -- -$!
This will kill the whole sub-process.
Here, by specifying a negative PID to kill, we kill the whole process group. See
man 1 kill:
Negative PID values may be used to choose whole process groups; see the PGID column in ps command output.
man 2 kill:
If pid is less than -1, then sig is sent to every process in the process group whose ID is -pid.
kill -PID will only work if job control is enabled in
bash (the default for interactive shells). Else, your subprocess won't have a dedicated process group and the kill command will fail with
kill: (-PID) - No such process
To work around that, either activate job control in
set -m), or use
pkill -P $!