2010-02-18 18 views
94

Tengo un programa que da salida a stdout y me gustaría silenciar ese resultado en un script Bash mientras canaliza a un archivo.Cómo silenciar el resultado en un script Bash?

Por ejemplo, la ejecución del programa sería:

% myprogram 
% WELCOME TO MY PROGRAM 
% Done. 

Quiero la siguiente secuencia de comandos para cualquier cosa que no la salida de la terminal:

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

de lo que recuerdo, redirigir la salida a un archivo hace que no se hizo eco de la terminal. ¿Qué no funciona para ti? –

+0

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

Respuesta

128

Si se da salida a stderr Además, podrás quiero silenciar eso. Puede hacerlo mediante la reorientación de descriptor de archivo 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

El "&>" línea es una versión más corta de lo que acaba de publicar . No he encontrado ese atajo antes. Voto ascendente. – chradcliffe

+0

Es nuevo en Bash 4. –

+4

'&>' es mucho mayor que 4. fiesta –

38

2>&1

con esto se le permite redirigir el stderr (que es el descriptor 2) para el descriptor de archivo 1, que es la de la salida estándar

myprogram > sample.s

Ahora, cuando realizan este está redirigiendo la salida estándar a los archivos sample.s

myprogram > sample.s 2>&1

La combinación de los dos comandos se traducirá en la reorientación tanto stderr y stdout a sample.s

myprogram 2>&1 /dev/null

Si quieres silencio completo su aplicación

+9

Al último le falta un operador de redirección; debe ser 'myprogram>/dev/null 2> & 1' (observe la cuña antes de'/dev/null' y el orden de las redirecciones). – tripleee

10

Si desea stdout y stderr tanto [ todo], entonces la manera más simple es:

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

y ejecútelo como ./script, y no obtendrá salida a su terminal. :)

el "> &" significa STDERR y STDOUT.la & también funciona de la misma manera con un tubo: ./script |& sed que enviará todo al SED

+3

¿No quieres decir "&>"? –

+1

Hmm .... Lo probé tanto a mi manera como a la tuya. Ambos parecen funcionar – Matt

+6

manual de bash (bajo "Redirección de la salida estándar y error estándar") y dice> y> y son equivalentes, pero la primera (y>) es el preferido. Sin embargo | y es la única forma de hacer esto para las tuberías. –

15

Toda la salida:

scriptname &>/dev/null 

portátil:

scriptname >/dev/null 2>&1 

portátil:

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

Para más nuevo bash (no portátil):

scriptname &>- 
+0

Esto no funciona. De hecho, crea un archivo llamado '-' y' &> 'es una extensión de shell bourne no portátil. – PhilT

+0

El equivalente portátil 'echo moo 1> & -' produce un error porque el descriptor de archivo 1 está cerrado: '-bash: echo: write error: Bad file descriptor' – tripleee

4

intento con:

myprogram &>/dev/null 

para conseguir ninguna salida

+2

Esto funciona en algunas shells, pero no es portátil. – tripleee

5

Si todavía está luchando para encontrar una respuesta, especialmente si se produjo un fichero para la salida, y que prefieren una clara alternativa: echo "hi" | grep "use this hack to hide the oputut :) "

+0

Hack interesante ... votando por astucia^_ ^ – skplunkerin

Cuestiones relacionadas