Quelle est la différence entre:
cmd > log 2>&1
et
cmd 2>&1 > log
où cmd est une commande?
Que devrais-je préférer et pourquoi?
L'ordre est important. Le moyen de raisonner sur les redirections est de les lire de gauche à droite et de réaliser que les redirections font pointer les flux au même endroit. Ils ne font pas pointer les flux les uns sur les autres.
Qu'est-ce que ça veut dire? Si tu le dis 2>&1
, vous redirigez stderr vers l'endroit où stdout est actuellement redirigé. Si stdout va sur la console, stderr l'est aussi. Si stdout va dans un fichier, stderr l'est aussi. Si vous suivez cela en redirigeant ensuite stdout, stderr pointe toujours vers ce stdout tilisé vers lequel pointer. Il ne "suit" pas la sortie standard vers le nouvel emplacement.
cmd > log 2>&1
Cela redirige stdout vers log
, puis redirige stderr vers l'endroit où stdout est maintenant redirigé, qui est log
.
Résultat final: stdout et stderr sont redirigés vers log
.
cmd 2>&1 > log
Cela redirige stderr vers l'endroit où stdout est actuellement redirigé, qui est généralement la console. Puis stdout est redirigé vers log
. N'oubliez pas que stderr ne "suit" pas stdout, il continue donc de rediriger vers la console.
Résultat final: stdout est redirigé vers le fichier journal et stderr est (toujours) envoyé à la console. Ce n'est certainement pas ce que vous voulez.
cmd > log 2>&1
Redirige STDOUT
vers le journal et remplace ensuite STDERR
par le STDOUT
redirigé.
cmd 2>&1 > log
Remplace STDERR
par STDOUT
, puis redirige le originalSTDOUT
vers le journal.