¿Cómo silenciar la salida en un script Bash?


149

Tengo un programa que sale a stdout y me gustaría silenciar esa salida en un script Bash mientras se canaliza a un archivo.

Por ejemplo, ejecutar el programa generará:

% myprogram
% WELCOME TO MY PROGRAM
% Done.

Quiero que el siguiente script no envíe nada al terminal:

#!/bin/bash
myprogram > sample.s

Por lo que recuerdo, redirigir la salida a un archivo hace que no se repita en el terminal. ¿Qué no te funciona?
Anon


Respuestas:


187

Si sale a stderr también, querrás silenciar eso. Puede hacerlo redirigiendo el 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

15
La línea "&>" es una versión más corta de lo que acabo de publicar. No he encontrado ese atajo antes. Votación a favor.
chradcliffe

55
&>es mucho más viejo que bash 4.
Ignacio Vazquez-Abrams

@ IgnacioVazquez-Abrams ¿Puede vincular el registro de cambios que documenta &>la introducción? : o
ThorSummoner

1
git.savannah.gnu.org/cgit/bash.git/tree/CHANGES#n2208 indica que >>&se introdujo en 4.0. No se menciona, &>pero los CAMBIOS solo se remontan a 2.0, así que creo que eso significa que ya estaba en 1.x.
tripleee

git blameen redir.cpuntos a una confirmación de 1998 para la ocurrencia más antigua aún en la base de código actual.
tripleee

60

Redirigir stderr a stdout

Esto redirigirá el stderr (que es el descriptor 2) al descriptor de archivo 1, que es el stdout.

2>&1

Redirigir stdout a archivo

Ahora, cuando realice esto, está redirigiendo la salida estándar al archivo sample.s

myprogram > sample.s

Redirigir stderr y stdout a archivo

La combinación de los dos comandos dará como resultado la redirección de stderr y stdout a sample.s

myprogram > sample.s 2>&1

Redireccionar stderr y stdout a / dev / null

Redireccionar a /dev/nullsi desea silenciar completamente su aplicación.

myprogram >/dev/null 2>&1

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

2
no myprogram &>/dev/nullseria suficiente?
JaviOverflow

38

Toda la salida:

scriptname &>/dev/null

Portátil:

scriptname >/dev/null 2>&1

Portátil:

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

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

scriptname &>-

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

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

11

Si desea STDOUT y STDERR ambos [todo], entonces la forma más simple es:

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

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

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


77
man bash (en "Redirección de salida estándar y error estándar") dice &> y> & son equivalentes, pero se prefiere el primero (&>). Sin embargo, | & es la única forma de hacerlo para tuberías.
John Mellor

1
@John No, la forma portátil de tuberías esa 2>&1 | b 2>&1 | c
tripleee

9

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


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

4

Probar con:

myprogram &>/dev/null

para no obtener salida


0

Nota: Esta respuesta está relacionada con la pregunta "Cómo desactivar el eco mientras se ejecuta un script de shell Linux", que a su vez se marcó como duplicado a este.

Para desactivar realmente el eco, el comando es:

stty -echo

(esto es, por ejemplo; cuando desea ingresar una contraseña y no desea que sea legible. Recuerde activar el eco al final de su script, de lo contrario la persona que ejecuta su script no verá lo que / ella escribe a partir de ese momento. Para activar echo en ejecución:

eco stty


0

Útil en guiones:


Obtenga solo el STDERR en un archivo, mientras oculta cualquier STDOUT incluso si el programa para ocultar no existe en absoluto (nunca bloquea el script principal), esto solo funcionaba:

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

Separar completamente y silenciar todo, incluso matar el script principal no abortará ./prog:

 ./prog </dev/null >/dev/null 2>&1 &

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.