Selon " Linux: The Complete Reference 6th Edition " (p. 44), vous ne pouvez diriger que STDERR en utilisant les |&
symboles de redirection.
J'ai écrit un script assez simple pour tester ceci:
#!/bin/bash
echo "Normal Text."
echo "Error Text." >&2
Je lance ce script comme ceci:
./script.sh |& sed 's:^:\t:'
Vraisemblablement, seules les lignes imprimées dans STDERR seront en retrait. Cependant, cela ne fonctionne pas vraiment comme ça, comme je le vois:
Normal Text.
Error Text.
Qu'est-ce que je fais mal ici?
la source
./script.sh > /tmp/stdout_goes_here |& grep 'grepping_script_stderr'
ne fonctionne pas comme prévu, à savoir: redirectscript.sh
destdout
(qui, selon l'extrait manuel devrait se produire en premier), puis permettregrep
de traiter de scriptstderr
. Au lieu de cela,stderr
et tdout` finissent tous les deux dansstdout_goes_here
|&
est un raccourci pour2>&1 |
.>/tmp/stdout_goes_here |&
Redirige donc stdout vers/tmp/stdout_goes_here
, puis2>&1
redirige stderr vers où va stdout, ce qui est/tmp/stdout_goes_here
, et|
ne reçoit finalement aucune entrée car la sortie de la commande a été redirigée. Gardez à l'esprit que la>&1
redirection vers le descripteur de fichier 1 va actuellement , et non vers où le descripteur de fichier 1 finira par aller . Pour diriger stderr uniquement et rediriger stdout vers un fichier, une façon est2>&1 >/tmp/stdout_goes_here |
.|&
tuyaux stderr vers stdin, comme2>&1 |
, donc le prochain programme obtiendra les deux sur stdin.la source
runcommand 2>&1 | tee
? c'est à direruncommand |& tee
?|&
dans bash est juste un raccourci (pas terriblement portable)2>&1 |
, donc vous devriez voir chaque ligne en retrait.la source