2017-10-18 11 views

Répondre

4

Vous devez rediriger la sortie standard de la commande vers stderr.

your_command.sh 1>&2

Si vous voulez faire à partir du script, vous pouvez envelopper votre script entier dans une fonction et rediriger sa sortie vers stderr:

main() { 
    echo hello 
    echo world 
    some_script.sh 
} 

main 1>&2 
+0

donc quelque chose comme? echo hello 1> & 2 Aussi, est-ce la même chose que (> & 2 echo hello) –

+2

@PhilO Oui, les opérateurs de redirection peuvent apparaître (presque) n'importe où dans la ligne de commande, car le shell les identifie et les supprime avant d'appeler la commande. Ils peuvent précéder le nom d'une commande simple, comme dans votre exemple, mais ils doivent apparaître après les commandes composées comme 'while',' for', 'if', etc.' echo 1> & 2 hello' fonctionnera également de la même manière. – chepner

3
exec >&2 

Mettez ça au en haut de votre script pour rediriger toutes les sorties futures vers stderr.

$ help exec 
exec: exec [-cl] [-a name] [command [arguments ...]] [redirection ...] 
    Replace the shell with the given command. 

    Execute COMMAND, replacing this shell with the specified program. 
    ARGUMENTS become the arguments to COMMAND. If COMMAND is not specified, 
    any redirections take effect in the current shell. 
+0

Simple! Supposons que je veux que la sortie soit à la fois stdout et stderr? –

+0

cela ne redirige pas la sortie des outils –

+0

Bien sûr que oui. Cela affecte toutes les commandes. –

1

La solution qui a fonctionné pour moi était de joindre le texte du script dans les() 's et de rediriger stdout stderr comme ceci:
( echo 1 echo 2 tool1 ) 1>&2

+0

Essayez-le avec des boucles. '{...}> & 2' –