2010-02-04 11 views
5

J'ai un script chauve-souris qui à un moment redirige le stderr d'un processus vers la sortie standard, puis l'écrit dans un fichier. Je l'habitude de le faire comme ceci:Bat rediriger stderr à stdout a un comportement étrange

process.exe 2>&1 > file.txt 

Cependant, cela ne redirige pas le stderr au fichier (pour des raisons que je ne comprends pas). Quand j'ai modifié la ligne à:

process.exe > file.txt 2>&1 

Tout a fonctionné. Ne sont pas ces deux équivalents?

Répondre

8

Le premier exemple fait essentiellement:

stderr = stdout; 
stdout = "file.txt"; 

Ainsi, stderr est toujours pointé à l'stdout d'origine. Votre deuxième exemple fait:

stdout = "file.txt"; 
stderr = stdout; 

Ainsi, les deux stderr et stdout référence à présent file.txt. C'est agilement subtil.

2

La redirection 2>&1 fonctionne à la fin de la ligne de commande. Cela ne fonctionnera pas comme premier paramètre de redirection, la redirection nécessite un nom de fichier et le 2>&1 à la fin. Vous essayez effectivement de rediriger stderr mais il n'y a pas d'espace réservé pour stocker les messages stderr d'où il a échoué. Le raccourci pour se rappeler c'est

 
executable > some_file 2>&1 

Hope this helps, Meilleures salutations, Tom.

1

Par ailleurs, pour des raisons que je ne comprends pas tout à fait, penser comme un

process.exe > result.txt 2<&1 

semble aussi travailler