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.
echo "Installing nano ......"; yum install nano &> /dev/null
Respuestas:
Utilizar este.
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í:
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>&-
: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:>&2
redirige stdout al descriptor 2 (stderr),>&3
redirige 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: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:
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.Consulte el manual de bash sobre redirecciones para obtener más detalles, opciones y sintaxis.
fuente
/dev/null
o/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
.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.
fuente
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
sdout
errores y las alertasstderr
.Puede desactivar
stdout
un comando haciendoy apague
stderr
haciendo:Si quieres ambos desactivados , puedes hacer:
El
2>&1
dice enviar a stderr el mismo lugar que la salida estándar.fuente
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:
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, siyum
no puede encontrar un paquete.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
.fuente
>/dev/null 2>&1
silenciará a ambosstdout
ystderr
fuente
No debería usar bash en este caso para deshacerse de la salida. Yum tiene una opción
-q
que suprime la salida.Seguramente también querrá usar
-y
Para ver todas las opciones de yum, use
man yum
.fuente
Escriba ".SILENT:" al principio de su secuencia de comandos sin dos puntos.
fuente