2>&1
significa que o redirecionamento do fluxo de erro para a saída padrão e o caracter &
por si só não tem muito significado: ele está esperando por você para fornecer um número do descritor de arquivo, mas você está dando a ele um nome de arquivo istead. Você quer redirecionar para o arquivo, não um descritor de arquivo numerado, então
commmand >> /home/user/accumulate_output.log 2>/home/user/error.log
Você pode entender &1
e &2
como "nomes de arquivos" referindo-se aos descritores de arquivo de stdout e stderr. Agora você vê que &
na frente de um nome de arquivo não faz sentido.
Em resumo, a sintaxe é n>&m
ou n>file
, em que n
é o descritor do arquivo a ser redirecionado (se não for especificado, significa saída padrão, n=1
) e, no lado direito, você pode redirecionar para o descritor de arquivo m
ou um arquivo com o nome file
. m
pode ser um número ou -
, o que significa que o descritor de arquivos deve ser fechado em vez de redirecionado (redirecionado "nowhere").
Há também uma sintaxe especial para redirecionar stdout e stderr para o mesmo local, mas é &>
. Ele irá apenas confundir você, pois não se enquadra na sintaxe normal - é um atalho que realmente realiza dois redirecionamentos de uma só vez.