Sim, há uma diferença.
/home/user/script.sh >> /home/user/stdout_and_error.log 2>&1
Isso enviará STDOUT e STDERR para /home/user/stdout_and_error.log
.
/home/user/script.sh 2>&1 >> /home/user/stdout_and_error.log
Isso enviará STDOUT para /home/user/stdout_and_error.log
e STDERR para o que foi anteriormente STDOUT.
Quando você executa um redirecionamento de shell, o lado esquerdo do redirecionamento vai para onde o lado direito do redirecionamento se dirige atualmente. Significado em 2>&1
, envia STDERR (2) para onde quer que o STDOUT (1) vá atualmente.
Mas se você depois redirecionar o STDOUT para algum outro lugar, o STDERR não o acompanha. Ele continua indo para onde STDOUT estava indo anteriormente. É por isso que no seu primeiro exemplo, tanto o STDOUT quanto o STDERR irão para o mesmo local, mas no segundo eles não o farão.