pipes and bash shell command redirect pipe

bash - pipes - ¿Hay un método abreviado de línea de comandos para ">/dev/null 2> & 1"



pipes linux c (9)

Editar: las soluciones basadas en (:) o |: pueden causar un error porque : no lee la stdin . Aunque podría no ser tan malo como cerrar el descriptor de archivo, como se propuso en la respuesta de Zaz.

  • Para shells que cumplen con bash y bash (zsh ...):

    $ program &>/dev/null OR $ program &> >(:) # Should actually cause error or abortion

  • Para todas las conchas:

    $ program 2>&1 >/dev/null OR $ program 2>&1|: # Should actually cause error or abortion

    $ program 2>&1 > >(:) no funciona para guiones porque se niega a operar el derecho de sustitución de procesos de una sustitución de archivos.

Explicaciones:

  • 2>&1 redirige stderr (descriptor de archivo 2) a stdout (descriptor de archivo 1).
  • | es la canalización regular de stdout al stdin de otro comando.
  • : es un shell incorporado que no hace nada (es equivalente a true ).
  • &> redirige las salidas stdout y stderr a un archivo.
  • >(your-command) es la sustitución del proceso. Se reemplaza con una ruta a un archivo especial, por ejemplo: /proc/self/fd/6 . Este archivo se utiliza como archivo de entrada para el comando your-command .

Nota: Un proceso que intenta escribir en un descriptor de archivo cerrado obtendrá un EBADF (descriptor de archivo incorrecto) que es más probable que cause un aborto que intentar escribir en | true | true Esto último causaría un EPIPE (tubería), vea el comentario de Charles Duffy.

Es realmente molesto escribir esto cuando no quiero ver la salida de un programa. Me encantaría saber si hay una forma más corta de escribir:

$ program >/dev/null 2>&1

La cáscara genérica es la mejor, pero también sería interesante conocer otras cáscaras, especialmente el golpe o el guión.


En bash , zsh , y dash

$ program >&- 2>&-

También puede parecer que funciona en otros shells porque &- es un descriptor de archivo incorrecto.

Tenga en cuenta que esta solución cierra los descriptores de archivo en lugar de redirigirlos a /dev/null , lo que podría hacer que los programas se aborten.


La mayoría de los shells soportan alias. Por ejemplo, en mi .zshrc tengo cosas como:

alias -g no=''2> /dev/null > /dev/null''

Entonces solo escribo

program no


Me parece que la solución más portátil y la mejor respuesta sería una macro en su terminal (PC).

De esa manera, no importa en qué servidor inicies sesión, siempre estará allí.

Si ejecuta Windows, puede obtener el resultado deseado con AHK (google, es código abierto) en dos pequeñas líneas de código. Eso puede traducir cualquier cadena de claves en cualquier otra cadena de claves, in situ.

Escribe "ugly.sh >> NULL" y lo reescribirá como "ugly.sh 2> & 1> / dev / null" o lo que no.

Las soluciones para otras plataformas son algo más difíciles. AppleScript puede pegar en las pulsaciones de teclado, pero no puede activarse tan fácilmente.


Puedes escribir una función para esto:

function nullify() { "$@" >/dev/null 2>&1 }

Para utilizar esta función:

nullify program arg1 arg2 ...

Por supuesto, puedes nombrar la función como quieras. Puede ser un solo carácter por ejemplo.

Por cierto, puedes usar exec para redireccionar stdout y stderr a /dev/null temporalmente. No sé si esto es útil en su caso, pero pensé en compartirlo.

# Save stdout, stderr to file descriptors 6, 7 respectively. exec 6>&1 7>&2 # Redirect stdout, stderr to /dev/null exec 1>/dev/null 2>/dev/null # Run program. program arg1 arg2 ... # Restore stdout, stderr. exec 1>&6 2>&7


Si /dev/null es demasiado para escribir, podría (como root) hacer algo como:

ln -s /dev/null /n

Entonces podrías simplemente hacer:

program >/n 2>&1

Pero, por supuesto, los scripts que escribas de esta manera no serán portátiles a otros sistemas sin configurar primero ese enlace simbólico.


También vale la pena señalar, que muchas veces la redirección de la salida no es realmente necesaria. Muchos programas Unix y Linux aceptan un "indicador silencioso", generalmente -n o -q , que suprime cualquier salida y solo devuelve un valor en caso de éxito o fracaso.

Por ejemplo

grep foo bar.txt >/dev/null 2>&1 if [ $? -eq 0 ]; then do_something fi

Puede ser reescrito como

grep -q foo bar.txt if [ $? -eq 0 ]; then do_something fi


La solución de Ayman Hourieh funciona bien para invocaciones únicas de programas excesivamente hablados. Pero si solo hay un pequeño conjunto de programas comúnmente llamados para los que desea suprimir la salida, considere silenciarlos agregando lo siguiente a su archivo .bashrc (o su equivalente, si usa otro shell):

CHATTY_PROGRAMS=(okular firefox libreoffice kwrite) for PROGRAM in "${CHATTY_PROGRAMS[@]}" do printf -v eval_str ''%q() { command %q "$@" &>/dev/null; }'' "$PROGRAM" "$PROGRAM" eval "$eval_str" done

De esta manera, puede continuar invocando programas usando sus nombres habituales, pero su salida stdout y stderr desaparecerá en el depósito de bits.

Tenga en cuenta también que ciertos programas le permiten configurar la cantidad de salida de registro / depuración que generan. Para las aplicaciones KDE, puede ejecutar kdebugdialog y deshabilitar selectivamente o globalmente la salida de depuración.


>& /dev/null