Cómo ocultar la salida del comando en Bash

99

Quiero que mis scripts de Bash sean más elegantes para el usuario final. ¿Cómo oculto la salida cuando Bash está ejecutando comandos?

Por ejemplo, cuando Bash ejecuta

yum install nano

Lo siguiente se mostrará al usuario que ejecutó el Bash:

Loaded plugins: fastestmirror
base                                                     | 3.7 kB     00:00
base/primary_db                                          | 4.4 MB     00:03
extras                                                   | 3.4 kB     00:00
extras/primary_db                                        |  18 kB     00:00
updates                                                  | 3.4 kB     00:00
updates/primary_db                                       | 3.8 MB     00:02
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package nano.x86_64 0:2.0.9-7.el6 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package         Arch              Version                Repository       Size
================================================================================
Installing:
 nano            x86_64            2.0.9-7.el6            base            436 k

Transaction Summary
================================================================================
Install       1 Package(s)

Total download size: 436 k
Installed size: 1.5 M
Downloading Packages:
nano-2.0.9-7.el6.x86_64.rpm                              | 436 kB     00:00
warning: rpmts_HdrFromFdno: Header V3 RSA/SHA256 Signature, key ID c105b9de: NOKEY
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
Importing GPG key 0xC105B9DE:
 Userid : CentOS-6 Key (CentOS 6 Official Signing Key) <[email protected]>
 Package: centos-release-6-4.el6.centos.10.x86_64 (@anaconda-CentOS-201303020151.x86_64/6.4)
 From   : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : nano-2.0.9-7.el6.x86_64                                      1/1
  Verifying  : nano-2.0.9-7.el6.x86_64                                      1/1

Installed:
  nano.x86_64 0:2.0.9-7.el6

Complete!

Ahora quiero ocultar esto al usuario y en su lugar mostrar:

    Installing nano ......

¿Cómo puedo realizar esta tarea? Definitivamente ayudaré a que el script sea más fácil de usar. En caso de que se produzca un error, deberá mostrárselo al usuario.

Me gustaría saber cómo mostrar el mismo mensaje mientras se ejecuta un conjunto de comandos.

usuario2650277
fuente
4
echo "Installing nano ......"; yum install nano &> /dev/null
user000001

Respuestas:

246

Utilizar este.

{
  /your/first/command
  /your/second/command
} &> /dev/null

Explicación

Para eliminar la salida de los comandos, tiene dos opciones:

  • Cierre el archivo descriptor de salida, lo que evita que acepte más entradas. Eso se ve así:

    your_command "Is anybody listening?" >&-

    Normalmente, la salida va al descriptor de archivo 1 (stdout) o 2 (stderr). Si cierra un descriptor de archivo, tendrá que hacerlo para cada descriptor numerado, ya que &>(a continuación) es una sintaxis especial de BASH incompatible con >&-:

    /your/first/command >&- 2>&-

    Tenga cuidado de anotar el orden: >&- cierra stdout , que es lo que quiere hacer; &>-redirige stdout y stderr a un archivo llamado -(guion), que no es lo que quiere hacer. Al principio se verá igual, pero este último crea un archivo perdido en su directorio de trabajo. Es fácil de recordar: >&2redirige stdout al descriptor 2 (stderr), >&3redirige stdout al descriptor 3 y >&-redirige stdout a un callejón sin salida (es decir, cierra stdout).

    También tenga en cuenta que algunos comandos pueden no manejar un descriptor de archivo cerrado particularmente bien ("error de escritura: descriptor de archivo incorrecto"), por lo que la mejor solución puede ser ...

  • Redirigir la salida a/dev/null , que acepta toda la salida y no hace nada con ella. Se parece a esto:

    your_command "Hello?" > /dev/null

    Para la redirección de salida a un archivo, puede dirigir tanto stdout como stderr al mismo lugar de manera muy concisa, pero solo en bash:

    /your/first/command &> /dev/null

Finalmente, para hacer lo mismo con varios comandos a la vez, rodee todo con llaves. Bash trata esto como un grupo de comandos , agregando los descriptores del archivo de salida para que pueda redirigirlos todos a la vez. Si está familiarizado con las subcapas que usan ( command1; command2; )sintaxis, encontrará que las llaves se comportan casi exactamente de la misma manera, excepto que a menos que las involucre en una tubería, las llaves no crearán una subcapa y, por lo tanto, le permitirán establecer variables dentro.

{
  /your/first/command
  /your/second/command
} &> /dev/null

Consulte el manual de bash sobre redirecciones para obtener más detalles, opciones y sintaxis.

Jeff Bowman
fuente
Hola, sé que es una pregunta antigua, pero ¿se puede hacer lo mismo condicionalmente? ¿Como si quisiera ocultar la salida bajo ciertas condiciones? Sé que puedo replicar la misma parte en if-else, pero ¿hay una mejor manera de hacerlo?
Usama Zafar
@UsamaZafar Lo haría configurando una variable ( "parámetro de shell" ), que se establece en /dev/nullo /dev/stdout(o /path/to/a/logfile) condicionalmente anteriormente en el script, y luego redirigir a ese destino usando &> $output_dest(o como se llame). Si no desea combinar stdout y stderr en ese caso, puede redirigirlos por separado como > $output_dest 2> $errors_dest.
Jeff Bowman
35

Puede redirigir stdout a / dev / null.

yum install nano > /dev/null

O puede redirigir tanto stdout como stderr,

yum install nano &> /dev/null.

Pero si el programa tiene una opción silenciosa, es incluso mejor.

ktm5124
fuente
23

Un proceso normalmente tiene dos salidas a la pantalla: stdout (salida estándar) y stderr (error estándar).

Normalmente, los mensajes informativos van ay los sdouterrores y las alertas stderr.

Puede desactivar stdoutun comando haciendo

MyCommand >/dev/null

y apague stderrhaciendo:

MyCommand 2>/dev/null

Si quieres ambos desactivados , puedes hacer:

MyCommand 2>&1 >/dev/null

El 2>&1dice enviar a stderr el mismo lugar que la salida estándar.

LeOn - Han Li
fuente
8

Puede redirigir la salida a /dev/null. Para obtener más información sobre / dev / null, lea este enlace .

Puede ocultar la salida de un comando de las siguientes formas:

echo -n "Installing nano ......"; yum install nano > /dev/null; echo " done."; 

Redirigir la salida estándar a /dev/null, pero no el error estándar. Esto mostrará los errores que ocurren durante la instalación, por ejemplo, si yumno puede encontrar un paquete.

echo -n "Installing nano ......"; yum install nano &> /dev/null; echo " done.";

Si bien este código no mostrará nada en la terminal, ya que tanto el error estándar como la salida estándar se redirigen y, por lo tanto, se anulan a /dev/null.

Giuseppe Pes
fuente
1
Gran parte ... amigo, ¿puede mostrarme cómo generar el mismo mensaje solo una vez para un conjunto de comandos?
user2650277
5

>/dev/null 2>&1silenciará a ambos stdoutystderr

yum install nano >/dev/null 2>&1
Quanlong
fuente
4

No debería usar bash en este caso para deshacerse de la salida. Yum tiene una opción -qque suprime la salida.

Seguramente también querrá usar -y

echo "Installing nano..."
yum -y -q install nano

Para ver todas las opciones de yum, use man yum.

kkeller
fuente
Gracias, asumí que yum tenía uno ya que apt-get usó -qq también para suprimir. Esto fue útil para lo que estoy haciendo.
Hyperion
0
.SILENT:

Escriba ".SILENT:" al principio de su secuencia de comandos sin dos puntos.

Arif
fuente