A sintaxe que você usou está errada.
cmd &2>1 >file
será dividido como
cmd &
2>1 >file
Isto irá:
- Executar
cmdcomo um trabalho em segundo plano sem redirecionamentos - Em um processo separado (sem um comando!), você redirecionará
stderrpara um arquivo chamado literalmente de1e redirecionarástdoutparafile
A sintaxe que você quer é:
cmd >file 2>&1
A ordem das operações é importante. Isto irá:
- Redirecionar
stdoutparafile - Redirecionar
stderrpara&1- ou seja, o mesmo filehandle questdout
O resultado é que stderr e stdout serão redirecionados para file .
Em bash , uma sintaxe não-padrão mais simples (e por isso não recomendo, por questões de portabilidade), a sintaxe de cmd &> file faz a mesma coisa.