web-dev-qa-db-fra.com

cmd 2> & 1> log vs cmd> log 2> & 1

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?

29
dogbane

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.

Droite

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.

Faux

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.

77
John Kugelman
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.

6
Marcus Borkenhagen