From :h :make
:
The ":make" command executes the command given with the 'makeprg' option.
This is done by passing the command to the shell given with the 'shell'
option. This works almost like typing
":!{makeprg} [arguments] {shellpipe} {errorfile}".
{makeprg} is the string given with the 'makeprg' option. Any command can be
used, not just "make". …
[arguments] is anything that is typed after ":make".
{shellpipe} is the 'shellpipe' option.
{errorfile} is the 'makeef' option, with ## replaced to make it unique.
So, it's not exactly the same as just :!make
. Following through, for shellpipe
:
'shellpipe' 'sp'
'shellpipe' 'sp' string (default ">", "| tee", "|& tee" or "2>&1| tee")
…
For Unix the default it "| tee". The stdout of the compiler is saved
in a file and echoed to the screen. If the 'shell' option is "csh" or
"tcsh" after initializations, the default becomes "|& tee". If the
'shell' option is "sh", "ksh", "mksh", "pdksh", "zsh" or "bash" the
default becomes "2>&1| tee".
So, the actual command is more like:
:!make 2>&1 | tee bar
And, in fact, if you run:
aspell -c foo.txt 2>&1 | tee bar
You'll get the same behaviour.
So, this is perfectly normal behaviour.