Comment désactiver la sortie dans un script Bash?

149

J'ai un programme qui sort vers stdout et je voudrais faire taire cette sortie dans un script Bash tout en redirigeant vers un fichier.

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

% myprogram
% WELCOME TO MY PROGRAM
% Done.

Je veux que le script suivant ne produise rien sur le terminal:

#!/bin/bash
myprogram > sample.s
Sam
la source
D'après ce que je me rappelle, la redirection de la sortie vers un fichier fait qu'elle n'est pas renvoyée en écho au terminal. Qu'est-ce qui ne fonctionne pas pour vous?
Anon.
serverfault.com/questions/41964/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Réponses:

187

S'il sort également vers stderr, vous voudrez le désactiver. 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
John Kugelman
la source
15
La ligne "&>" est une version plus courte de ce que je viens de publier. Je n'ai jamais rencontré ce raccourci auparavant. Vote positif.
chradcliffe
5
&>est beaucoup plus vieux que bash 4.
Ignacio Vazquez-Abrams
@ IgnacioVazquez-Abrams Pouvez-vous lier l' &>introduction du journal des modifications ? : o
ThorSummoner
1
git.savannah.gnu.org/cgit/bash.git/tree/CHANGES#n2208 indique qu'il a >>&été introduit dans la version 4.0. Il n'y a aucune mention de &>mais les CHANGEMENTS ne remontent qu'à 2.0, donc je pense que cela signifie qu'il était déjà en 1.x.
tripleee
git blameon redir.cpointe vers un commit 1998 pour l'occurrence la plus ancienne encore dans la base de code actuelle.
tripleee
60

Rediriger stderr vers stdout

Cela redirigera le stderr (qui est le descripteur 2) vers le descripteur de fichier 1 qui est le stdout.

2>&1

Rediriger stdout vers un fichier

Maintenant, lorsque vous effectuez cela, vous redirigez le stdout vers le fichier sample.s

myprogram > sample.s

Rediriger stderr et stdout vers un fichier

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

myprogram > sample.s 2>&1

Rediriger stderr et stdout vers / dev / null

Redirigez vers /dev/nullsi vous souhaitez désactiver complètement votre application.

myprogram >/dev/null 2>&1
Débogueur
la source
13
Le dernier n'a pas d'opérateur de redirection; ça devrait être myprogram >/dev/null 2>&1(notez le coin avant /dev/nullet l'ordre des redirections).
tripleee
2
ne suffirait-il pas myprogram &>/dev/null?
JaviOverflow
38

Toutes les sorties:

scriptname &>/dev/null

Portable:

scriptname >/dev/null 2>&1

Portable:

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

Pour les plus récents bash (pas de portable):

scriptname &>-
Eduardo Cuomo
la source
Cela ne marche pas. Il crée en fait un fichier nommé -et &>est une extension bourne shell non portable.
PhilT
L'équivalent portable echo moo 1>&-produit une erreur car le descripteur de fichier 1 est fermé:-bash: echo: write error: Bad file descriptor
tripleee
11

Si vous voulez à la fois STDOUT et STDERR [tout], alors le moyen le plus simple est:

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

puis exécutez-le comme ./script, et vous n'obtiendrez aucune sortie sur votre terminal. :)

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

Mat
la source
7
man bash (sous "Redirection de la sortie standard et de l'erreur standard") dit &> et> & sont équivalents mais le premier (&>) est préféré. Cependant | & est le seul moyen de le faire pour les tuyaux.
John Mellor
1
@John Non, le moyen portable pour les tuyaux esta 2>&1 | b 2>&1 | c
tripleee
9

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

Henry H.
la source
2
Piratage intéressant ... vote pour l'intelligence ^ _ ^
skplunkerin
4

Essayez avec:

myprogram &>/dev/null

pour n'obtenir aucune sortie

Swathi
la source
0

Note: Cette réponse est liée à la question "Comment désactiver l'écho lors de l'exécution d'un script shell Linux" qui a été à son tour marquée comme dupliquée avec celle-ci.

Pour désactiver réellement l'écho, la commande est:

stty -echo

(c'est, par exemple, lorsque vous voulez entrer un mot de passe et que vous ne voulez pas qu'il soit lisible. N'oubliez pas d'activer l'écho à la fin de votre script, sinon la personne qui exécute votre script ne verra pas ce qu'il / elle tape à partir de ce moment. Pour activer l'écho en cours d'exécution:

écho stty

Berni
la source
0

Utile dans les scripts:


Obtenez uniquement le STDERR dans un fichier, tout en masquant tout STDOUT même si le programme à masquer n'existe pas du tout (ne bloque jamais le script parent), cela seul fonctionnait:

stty -echo && ./programMightNotExist 2> errors.log && stty echo

Détachez complètement et mettez tout au silence, même tuer le script parent n'abandonnera pas ./prog:

 ./prog </dev/null >/dev/null 2>&1 &
NVRM
la source
0

Pour sortie uniquement en cas d'erreur :

donc [commande]

Logo

Alberto Salvia Novella
la source