On Wed, Apr 25, 2012 at 1:36 PM, Ted Okuzumi <tedokuz...@gmail.com> wrote: > Please note that if I use a different command in the while loop it works. > > So instead of > echo "$mydata" | while read -r line; do myarray+=( "$line" ); done > > if I say: > echo "$mydata" | while read -r line; do echo "$line" ; done > > Then it works. To pipe output into a while statement works, normally, > however it fails when the array+=( ) is used. It doesn't fail on other > commands that I've seen. > > This is why I am saying it is definitely a bug. Do you not agree? > > Thanks, > Ted
It is NOT a bug. POSIX specifies this behavior. The echo is still run in a subshell... The issue is that commands in a pipeline are run in a subshell. This means that assignments and changes in PWD do not persist afterwards. See http://mywiki.wooledge.org/BashFAQ/024. The lastpipe shopt will work, as discussed before. The other options are process substitution, or (POSIXly) a fifo. Examples: # Process substitution: while read -r line; do array+=("$line") done < <(some_command) # FIFO: mkfifo myfifo || exit trap 'rm -f myfifo' EXIT some_command > myfifo & while read -r line; do array+=("$line") done < myfifo # Or, since it's a string you're using in your example, you could use a here string or here document while read -r line; do array+=("$line"); done <<<"$mydata" while read -r line; do array+=("$line"); done <<EOF $mydata EOF mapfile, with bash4, is also an option for this particular case.