Coproc Tutorial (2011)
zsh.orgI've never found a case where coproc actually solves a problem I'm facing.
Note that bash's version is slightly different but pretty close. Also, bash supports `lastpipe` nowadays so you don't have to use this as a workaround for that issue, and `< <()` is more often the useful thing for custom pipeline composability, and without suffering from the "only one coprocess may exist" limitation.
You can get the pid of the process in the process redirection case (`while read ...; do ...; done < <(some_program)`) but not in the | case (`some_program | while read ...; do ...; done`).
I used it once for configuring Herbstluftwm and Dzen, but it was very fussy and I ended up refactoring my script later into separate processes.
I use it to launch GUI apps from the terminal, e.g.
coproc 'nemo .'Is that better than using ordinary job control (nemo . &) ?
Possibly. There are race conditions with `wait` for `$somepid` because shells kinda have to reap processes as soon as possible, but that means that your `$somepid` can be stale and even refer to some other process. If you have a pipe from the process' stdout and/or stderr then when you can try to read from that pipe to know if the process exited -- you might still lose the exit status, unless you run the program like `(the_program ...; stat=$?; printf '%s\n' $stat 1>&2; exit $stat) &` and then read the exit status from the stderr pipe.
Most GUI apps are noisy as hell in their output.
Though I guess there's always nemo . >/dev/null 2>&1 &