|
From: | Florian Mayer |
Subject: | process substitution flawed by design |
Date: | Mon, 20 Feb 2017 23:25:22 +0100 |
User-agent: | Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.6.0 |
echo foo | tee >(echo $$) >(echo $$)
>/dev/null | cat returns the same PID twice. I'm using the version 4.4.11. Why is there only one process for all the expansions? Why wasn't that documented? I think the only right way to do multiple process expansions in one command is by actually starting one process for each expansion. Why doesn't this workaround work? It produces the same output as the first snippet echo foo | tee >((echo $$)) >((echo $$)) >/dev/null | cat You might now be wondering why I'm saying that it is wrong to execute everything in one process. Consider the following: cat some file | tee \ >(mutex --lock; critical; mutex --unlock) \ >(mutex --lock; critical; mutex --unlock) \ > /dev/null | cat What I'd wish for is that both >() blocks get the same input by tee and produce some synchronized output. That is also the most natural way to think about this expansion. GNU parallel allows for something like mutex --lock by the way. There are problems that'd require for something like the above. |
[Prev in Thread] | Current Thread | [Next in Thread] |