Dans les systèmes de type Unix, il existe deux chemins de sortie qui, s'ils ne sont pas modifiés, enverront la sortie à votre écran. L'erreur standard (ou stderr) est celle qui capture la plupart des échecs et des conditions d'erreur.
Pour transmettre le message d'autorisation refusée dans le stderr au même flux de sortie que "sortie régulière", vous devez combiner les deux. Dans votre exemple, pour que votre grep -v
ordinateur fonctionne correctement, vous combinez stdout (sortie standard) et stderr avec la syntaxe arcane que vous voyez.
Dans la section 3.2.2 Pipelines du manuel GNU Bash :
Si « |&
» est utilisé, l'erreur standard de command1 , en plus de sa sortie standard, est connectée à l'entrée standard de command2 via le tuyau; c'est un raccourci pour 2>&1 |
. Cette redirection implicite de l'erreur standard vers la sortie standard est effectuée après toutes les redirections spécifiées par la commande.
De plus, comme le souligne geirha, si vous voulez simplement vous débarrasser de la sortie stderr, vous voudriez faire quelque chose comme
find -name 'myfile.*' 2> /dev/null
ou peut-être
find -name 'myfile.*' 2> /tmp/errorlog
Et notez que si vous avez des chaînes de commandes, telles que la find
transmission de sa sortie, xargs
vous devrez mettre le pipeline entier de commandes entre parenthèses pour capturer la sortie de tous les composants de la commande. Par exemple,
(find | egrep ^[RS].[0-9]+/.svg] | xargs head -1 ) 2> /dev/null
Si vous avez omis les parenthèses, et avez fait cela à la place -
find | egrep ^[RS].[0-9]+/.svg] | xargs head -1 2> /dev/null
vous verrez toujours des erreurs d'autorisation refusée de la recherche ou egrep, mais stderr serait redirigé pour xargs.
Comme vous l'avez vu, vous ne jeterez probablement le stderr qu'après avoir vu son contenu pendant un test.
Notez qu'avec GNU find
et pour autant que je sache, tout compatible POSIX find
, l' -print
option est implicite. Vous pouvez toujours le fournir explicitement si vous le souhaitez.
2>&1 |
peut être utilisé à la place de|&
(c.-à-d., On peut rediriger explicitement stderr vers stdout, puis le rediriger vers la commande suivante du pipeline).2> >( grep filter )
est également pratiqueLes messages d'erreur sont écrits sur stderr , pas sur stdout , mais sur les
|
canaux uniquement stdout .Vous voulez sans doute
|&
, qui tuyaux stderr ainsi que stdout .la source
Si vous voulez ignorer les messages d'erreur, redirigez simplement stderr vers / dev / null.
Pensez également à lire http://mywiki.wooledge.org/UsingFind .
la source