2010-02-18 8 views
94

J'ai un programme qui sort vers stdout et voudrait faire taire cette sortie dans un script Bash tout en redirigeant vers un fichier.Comment faire pour réduire la sortie dans un script Bash?

Par exemple, l'exécution du programme affichera:

% myprogram 
% WELCOME TO MY PROGRAM 
% Done. 

Je veux que le script suivant pour rien sortie à la borne:

#!/bin/bash 
myprogram > sample.s 
+0

De ce que je me souviens, la redirection de la sortie vers un fichier ne fait pas écho au terminal. Qu'est-ce qui ne fonctionne pas pour toi? –

+0

http://serverfault.com/questions/41964/how-to-hide-the-output-of-a-shell-application-in-linux –

Répondre

128

Si elle émet stderr ainsi vous vouloir le faire taire. Vous pouvez le faire en redirigeant le descripteur de fichier 2:

# Send stdout to out.log, stderr to err.log 
myprogram > out.log 2> err.log 

# Send both stdout and stderr to out.log 
myprogram &> out.log  # New bash syntax 
myprogram > out.log 2>&1 # Older sh syntax 

# Log output, hide errors. 
myprogram > out.log 2> /dev/null 
+7

La ligne "&>" est une version plus courte de ce que je viens de poster . Je n'ai pas rencontré ce raccourci avant. Upvoting. – chradcliffe

+0

C'est nouveau dans Bash 4. –

+4

'&>' est beaucoup plus ancien que bash 4. –

38

2>&1

avec cela, vous serez redirigez stderr (qui est le descripteur 2) au descripteur de fichier 1 qui est le stdout

myprogram > sample.s

maintenant, quand effectuer cette vous redirigez stdout au fichier sample.s

myprogram > sample.s 2>&1

La combinaison des deux commandes entraînera la redirection à la fois stderr et stdout à sample.s

myprogram 2>&1 /dev/null

Si vous voulez complètement silencieux votre application

+9

Le dernier manque un opérateur de redirection; il devrait être 'myprogram>/dev/null 2> & 1' (notez le coin avant'/dev/null' et l'ordre des redirections). – tripleee

10

Si vous voulez STDOUT et STDERR à la fois [ tout], alors la façon la plus simple:

#!/bin/bash 
myprogram >& sample.s 

alors exécuté comme ./script, et vous n'obtiendrez aucune sortie à votre terminal. :)

le "> &" signifie STDERR et STDOUT.le & fonctionne aussi de la même manière avec un tuyau: ./script |& sed qui va envoyer tout à sed

+3

Vous ne voulez pas dire "&>"? –

+1

Hmm .... Je viens d'essayer à la fois mon chemin et le vôtre. Les deux semblent fonctionner – Matt

+6

man bash (sous "Rediriger sortie standard et erreur standard") dit &> et> & sont équivalents mais le premier (&>) est préféré. Cependant | & est le seul moyen de le faire pour les tuyaux. –

15

Tous les résultats:

scriptname &>/dev/null 

Portable:

scriptname >/dev/null 2>&1 

Portable:

scriptname >/dev/null 2>/dev/null 

Pour plus récent bash (non portable):

scriptname &>- 
+0

Cela ne fonctionne pas. Il crée en fait un fichier nommé '-' et' &> 'est une extension bourne shell non portable. – PhilT

+0

L'équivalent portable 'echo moo 1> & -' génère une erreur car le descripteur de fichier 1 est fermé: '-bash: echo: erreur d'écriture: mauvais descripteur de fichier' – tripleee

4

Essayez avec:

myprogram &>/dev/null 

pour obtenir aucune sortie

+2

Cela fonctionne dans certains shells, mais n'est pas portable. – tripleee

5

Si vous êtes toujours du mal à trouver une réponse, surtout si vous avez produit un fichier pour la sortie, et que vous préférez une vision claire alternative: echo "hi" | grep "use this hack to hide the oputut :) "

+0

Intéressant hack ... upvoting pour l'intelligence^_ ^ – skplunkerin

Questions connexes