Hello, 1. Process substitution within array indices.
The difference between (( 1<(2) )) and (( a[1<(2)] )) might be seen as surprising. Zsh and ksh don't do this in any arithmetic context AFAICT. Fun stuff: # print "moo" dev=fd=1 _[1<(echo moo >&2)]= # Fork bomb ${dev[${dev='dev[1>(${dev[dev]})]'}]} 2. EXIT trap doesn't fire when leaving a process substitution. $ ksh -c '[[ -n $(< <(trap "tee /dev/fd/3" EXIT)) ]] 3>&1 <<<works || echo "fail :("' works $ zsh -c '[[ -n $(< <(trap "tee /dev/fd/3" EXIT)) ]] 3>&1 <<<works || echo "fail :("' works $ bash -c '[[ -n $(< <(trap "tee /dev/fd/3" EXIT)) ]] 3>&1 <<<works || echo "fail :("' fail :( 3. Can't wait on a process substitution. ksh appears to be able to wait on a process substitution. Bash and Zsh can't, but I'm not sure why. $ ksh -c '{ { : <(sleep 1; printf 1 >&2); } 2>&1; wait $!; printf 2; } | cat; echo' 12 $ bash -c '{ { : <(sleep 1; printf 1 >&2); } 2>&1; wait $!; printf 2; } | cat; echo' bash: wait: pid 9027 is not a child of this shell 21 At least, this is a confusing error, because that actually is a direct child of the shell that runs the wait. Process substitutions do set $! in Bash, not in Zsh. -- Dan Douglas