¿Cómo puedo suprimir toda la salida de un comando usando Bash?

296

Tengo un script Bash que ejecuta un programa con parámetros. Ese programa genera algún estado (haciendo esto, haciendo eso ...). No hay ninguna opción para que este programa sea silencioso. ¿Cómo puedo evitar que el script muestre algo?

Estoy buscando algo como el "eco desactivado" de Windows .

6bytes
fuente

Respuestas:

510

A continuación, se envía una salida estándar al dispositivo nulo (segmento de bits).

scriptname >/dev/null

Y si también desea que se envíen mensajes de error allí, use uno de (el primero puede no funcionar en todos los shells):

scriptname &>/dev/null
scriptname >/dev/null 2>&1
scriptname >/dev/null 2>/dev/null

Y, si desea grabar los mensajes, pero no verlos, reemplácelos /dev/nullcon un archivo real, como:

scriptname &>scriptname.out

Para completar, en Windows cmd.exe (donde "nul" es el equivalente de "/ dev / null"), es:

scriptname >nul 2>nul
andynormancx
fuente
8
Tenga en cuenta que '&>' es peculiar de bash (y tal vez C shells); Los shells de Korn y Bourne requieren 2> / dev / null o 2> & 1 (para enviar stderr al mismo lugar que stdout). El shell Korn parece interpretar '&>' como "ejecutar las cosas en segundo plano y luego, hacer la redirección de E / S en un comando vacío".
Jonathan Leffler
2
Tenga en cuenta que algunos comandos escriben directamente en el dispositivo terminal en lugar de en la salida / error estándar. Para probar, ingrese echo foo > $(tty)un script y ejecute ./test.sh &> /dev/null: la salida todavía se imprime en el terminal. Por supuesto, esto no es un problema si está escribiendo un script que no utiliza dichos comandos.
l0b0
1
@ l0b0, ¿hay alguna manera de hacer que el script (o cualquier otro programa) sea diferente para que toda la salida se redirija independientemente de su ejemplo? Sé que la pantalla y el script pueden hacer algo así, pero ambos son quisquillosos y varían de * nix a * nix.
Brent
@yang /dev/nullexiste en Cygwin, no necesita usarlo nul.
dimo414
47

Algo como

script > /dev/null 2>&1

Esto evitará la salida estándar y la salida de error, redirigiéndolos a ambos /dev/null.

Diego Sevilla
fuente
55
También se logra con solo &> si desea guardar algo de escritura;)
andynormancx
1
Aunque estoy agregando esto a mi comando gs (GhostScript), todavía se imprime **** Advertencia: El archivo tiene un marcador %% EOF dañado, o basura después de %% EOF. ¿Algún consejo?
ZurabWeb
Esto no se ejecuta el proceso en los sistemas UNIX, que tenía que hacer2>/dev/null
Alper
13

Tratar

: $(yourcommand)

: es la abreviatura de "no hacer nada".

$() es solo tu comando.

V0idSt4r
fuente
3
Muy interesante, pero hay una limitación: el código de estado devuelto siempre es 0(correcto). Veamos un ejemplo usando un comando falseque siempre devuelve 1(falla). Por ejemplo ( echo foo | tee file ; false ) && echo barmuestra foo. Usando su truco para suprimir la salida: ( : $(echo foo | tee file ; false) ) && echo bar. Pero muestra barque el código de estado de retorno es 0(este no es el código de estado devuelto false). Actualice su respuesta con esta limitación. Saludos
olibre
2
@olibre, ¿qué pasa DUMMY=$(yourcommand)? No tiene la limitación que ha mencionado. :)
semente
3
@semente Perfecto: el comando DUMMY=$( echo foo | tee file ; false ) && echo barno muestra nada. Y se DUMMY=$( echo foo | tee file ; true ) && echo barmuestra el comando bar. Avíseme si proporciona una respuesta para votarlo ;-) Saludos
olibre
9

Una alternativa que puede encajar en algunas situaciones es asignar el resultado de un comando a una variable:

$ DUMMY=$( grep root /etc/passwd 2>&1 )
$ echo $?
0
$ DUMMY=$( grep r00t /etc/passwd 2>&1 )
$ echo $?
1

Dado que Bash y otros intérpretes de línea de comandos POSIX no consideran las asignaciones de variables como un comando, se respeta el código de retorno del comando actual.

Nota: la asignación con la palabra clave typeseto declarese considera como un comando, por lo que el código de retorno evaluado en caso de que sea la asignación en sí y no el comando ejecutado en el sub-shell:

$ declare DUMMY=$( grep r00t /etc/passwd 2>&1 )
$ echo $?
0
semente
fuente
6

Al igual que la publicación de andynormancx , use esto (si está trabajando en un entorno Unix):

scriptname > /dev/null

O puede usar esto (si está trabajando en un entorno Windows):

scriptname > nul
Lucas Gabriel Sánchez
fuente
1
En realidad, puedes hacerlo mejor que eso en el shell de Windows. Si en cambio usa "scriptname> nul", entonces ni siquiera tendrá un archivo para eliminar, ya que "nul" es el equivalente de Windows de / dev / null.
andynormancx 05 de
1
@andynormancx: Eso es lo que odio del diseño del sistema de archivos de Windows. "Reserva" nombres de archivo como NUL, COM1, LPT1, CON, etc., sin importar en qué directorio se encuentre (incluso si está en un sistema de archivos que puede tener esos nombres de archivo, como en los recursos compartidos de red).
dreamlax
No creo haber usado NUL desde DOS 5.x, tuve un repentino recuerdo cuando vi esta respuesta;)
andynormancx
En caso de que haya utilizado > nulen Windows con cygwin o git bash y ahora esté atascado con un nularchivo que no se puede eliminar, pruebe esta respuesta , funcionó de maravilla.
Daemon Painter
4

Eche un vistazo a este ejemplo del Proyecto de documentación de Linux :

3.6 Muestra: archivo stderr y stdout 2

Esto colocará cada salida de un programa en un archivo. Esto es adecuado a veces para entradas cron, si desea que un comando pase en silencio absoluto.

     rm -f $(find / -name core) &> /dev/null 

Dicho esto, puedes usar esta simple redirección:

/path/to/command &>/dev/null
ivanleoncz
fuente
1

En su secuencia de comandos, puede agregar lo siguiente a las líneas que sabe que darán una salida:

some_code 2>>/dev/null

O también puedes probar

some_code >>/dev/null
Rohan Dsouza
fuente
1
nunca vi >> to / dev / null .. por curiosidad .. ¿Por qué haces esto?
Florian Berndl el
¿Está suprimiendo toda la salida?
Peter Mortensen
¿Por qué el doble ">" ( >>)?
Peter Mortensen