Configuration Information [Automatically generated, do not change]: Machine: x86_64 OS: linux-gnu Compiler: gcc Compilation CFLAGS: -DPROGRAM='bash' -DCONF_HOSTTYPE='x86_64' -DCONF_OSTYPE='linux-gnu' -DCONF_MACHTYPE='x86_64-unknown-linux-gnu' -DCONF_VENDOR='unknown' -DLOCALEDIR='/usr/share/locale' -DPACKAGE='bash' -DSHELL -DHAVE_CONFIG_H -I. -I. -I./include -I./lib -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2 -DDEFAULT_PATH_VALUE='/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin' -DSTANDARD_UTILS_PATH='/usr/bin:/bin:/usr/sbin:/sbin' -DSYS_BASHRC='/etc/bash.bashrc' -DSYS_BASH_LOGOUT='/etc/bash.bash_logout' uname output: Linux medinvdj 3.6.9-1-ARCH #1 SMP PREEMPT Tue Dec 4 08:04:10 CET 2012 x86_64 GNU/Linux Machine Type: x86_64-unknown-linux-gnu
Bash Version: 4.2 Patch Level: 39 Release Status: release I've noticed several issues with coproc, as stated below. 1) First of all, the man page and help output state: `The return status of a coprocess is the exit status of command.' No matter what, coproc seems to always return true. To reproduce: coproc false || echo error1 >&2; wait "$COPROC_PID" || echo error2 >&2 Output: [1] 31769 [1]+ Exit 1 coproc COPROC false error2 2) However, the exception to #1 is my second issue, with is that coproc always seems to fail when called within the test portion of an if statement. I have absolutely no idea why this happens. To reproduce: if ! coproc false; then echo error1 >&2; fi; wait "$COPROC_PID" || echo error2 >&2 Output: [1] 3971 error1 [1]+ Exit 1 ! coproc COPROC false error2 3) The first two issues aren't THAT big of a deal, because you can simply not worry about coproc's exit status and use wait's. That leads me to the third and largest issue, which is that "NAME_PID" only appears to work properly either when in an interactive shell or when there's no command between the coproc and the wait. To reproduce: #!/bin/bash # this one works coproc mycoproc { false ; } if ! wait "$mycoproc_PID"; then echo "error1" >&2 fi # this one does not coproc mycoproc { false; } while read -ru "${mycoproc[0]}" line; do echo "coproc: $line" done if ! wait "$mycoproc_PID"; then echo "error2" >&2 fi Output: error1 script: line 14: wait: `': not a pid or valid job spec error2 The whole reason I'm using a coprocess instead of process substitution is to be able to read the output into an array while also checking the exit status. For the time being, I can use a named pipe, but I was rather excited about being able to do this without having to worry about cleaning up files. Thanks for your time, I know this was a long one. -DJ