Introducción a las redirecciones de shell de Bash
- 1164
- 190
- Jaime Delgadillo
Objetivo
Aprenda a usar redirecciones, tuberías y tee en la carcasa de la fiesta
Sistema operativo y versiones de software
- Sistema operativo: - Distribución de Linux Agnóstico
Requisitos
- Acceso a una cáscara de fiesta
Convenciones
- # - requiere que los comandos de Linux dados se ejecuten con privilegios raíz directamente como un usuario raíz o mediante el uso de
sudo
dominio - ps - Requiere que los comandos de Linux dados se ejecuten como un usuario regular no privilegiado
Introducción
La redirección es la capacidad de redirigir la entrada y la salida de varios comandos hacia y desde archivos o dispositivos. Vamos a ver cómo funciona la redirección en Bash: el shell predeterminado en la mayoría de las distribuciones de Linux.
Descriptores de archivo
Cada vez que ejecuta un programa, tres descriptores de archivo
se crean de forma predeterminada:
- 0 -
stdin
(entrada estándar) - 1 -
stdout
(salida estándar) - 2 -
stderr
(Error estándar)
Por defecto el stdout
y stderr
Los descriptores están "conectados" a la pantalla, lo que significa que la salida del programa y sus errores no se guardan en ningún archivo, sino que se muestran, mientras que la entrada estándar se adjunta al teclado. Los operadores de redirección manipulamos esas asociaciones.
Redirigir la salida estándar
Como se dijo anteriormente, por defecto, la salida estándar de un programa se envía a la pantalla, pero en algunas circunstancias, como por ejemplo, en el contexto de un script, es posible que deseemos descartarlo, o tal vez enviarlo a un archivo. Cómo logramos esto? La clave aquí es el operador:
LS -L> Salida.TXT
En este pequeño ejemplo, redirigimos la salida del LS
Comando a la salida del archivo.txt (observe que el archivo no necesita existir, se crea automáticamente). No apareció nada en la pantalla, pero si verificamos el contenido del archivo, veremos algo bastante familiar:
$ CAT SALIDA.Txt Total 36 DRWXR-XR-X. 2 EGDOC EGDOC 4096 JUN 22 19:36 Escritorio DRWXR-XR-X. 2 EGDOC EGDOC 4096 Jun 22 19:36 Documentos DRWXR-XR-X. 2 EGDOC EGDOC 4096 Jun 23 02:40 Descargas DRWXRWXR-X. 13 EGDOC EGDOC 4096 Jun 23 08:13 Git DRWXR-XR-X. 2 EGDOC EGDOC 4096 JUN 22 19:36 Música -RW-RW-R--. 1 EGDOC EGDOC 0 Jun 23 09:38 Salida.txt drwxr-xr-x. 2 EGDOC EGDOC 4096 Jun 22 19:39 Fotos DRWXR-XR-X. 2 EGDOC EGDOC 4096 JUN 22 19:36 Público DRWXR-XR-X. 2 EGDOC EGDOC 4096 Jun 22 19:36 Plantillas DRWXR-XR-X. 2 EGDOC EGDOC 4096 22 de junio 19:36 Videos
Lo que vemos es la salida del LS
dominio. Si ahora intentamos nuevamente la redirección, el contenido actual del archivo será reemplazado por la nueva salida. ¿Cómo podemos preservar el contenido anterior y solo adjuntar nuevas líneas para ello? En este caso usamos el >>
operador:
LS -L >> Salida.TXT
De esta manera, si el archivo no existe o no tiene contenido, la redirección tendrá el mismo efecto que si usáramos el >
Operador, de lo contrario, el nuevo contenido se agregará al existente, como puede ver observando nuevamente el archivo:
Total 36 DRWXR-XR-X. 2 EGDOC EGDOC 4096 JUN 22 19:36 Escritorio DRWXR-XR-X. 2 EGDOC EGDOC 4096 Jun 22 19:36 Documentos DRWXR-XR-X. 2 EGDOC EGDOC 4096 Jun 23 02:40 Descargas DRWXRWXR-X. 13 EGDOC EGDOC 4096 Jun 23 08:13 Git DRWXR-XR-X. 2 EGDOC EGDOC 4096 JUN 22 19:36 Música -RW-RW-R--. 1 EGDOC EGDOC 0 Jun 23 09:38 Salida.txt drwxr-xr-x. 2 EGDOC EGDOC 4096 Jun 22 19:39 Fotos DRWXR-XR-X. 2 EGDOC EGDOC 4096 JUN 22 19:36 Público DRWXR-XR-X. 2 EGDOC EGDOC 4096 Jun 22 19:36 Plantillas DRWXR-XR-X. 2 EGDOC EGDOC 4096 Jun 22 19:36 Videos Total 40 DRWXR-XR-X. 2 EGDOC EGDOC 4096 JUN 22 19:36 Escritorio DRWXR-XR-X. 2 EGDOC EGDOC 4096 Jun 22 19:36 Documentos DRWXR-XR-X. 2 EGDOC EGDOC 4096 Jun 23 02:40 Descargas DRWXRWXR-X. 13 EGDOC EGDOC 4096 Jun 23 08:13 Git DRWXR-XR-X. 2 EGDOC EGDOC 4096 JUN 22 19:36 Música -RW-RW-R--. 1 EGDOC EGDOC 541 Jun 23 09:38 Salida.txt drwxr-xr-x. 2 EGDOC EGDOC 4096 Jun 22 19:39 Fotos DRWXR-XR-X. 2 EGDOC EGDOC 4096 JUN 22 19:36 Público DRWXR-XR-X. 2 EGDOC EGDOC 4096 Jun 22 19:36 Plantillas DRWXR-XR-X. 2 EGDOC EGDOC 4096 22 de junio 19:36 Videos
También es posible que necesitemos redirigir la salida de múltiples comandos a la vez: podemos obtener el resultado buscado usando aparatos ortopédicos para agruparlos:
$ echo "LinuxConfig"; ls -l; > salida.TXT
La salida.El archivo txt ahora contendrá tanto la cadena 'linuxconfig' como el resultado del LS -L
dominio.
Otra operación común es descartar la salida de un comando por completo, esta vez redirigirlo a un dispositivo especial: /dev /null. En sistemas operativos similares a unix /dev/nulo
(también conocido como bit bucket), es un dispositivo que descarta todos los datos escritos:
ls -l> /dev /null
Redirigir tanto la salida estándar como el error estándar
En los ejemplos anteriores, solo redirigimos la salida estándar. Si se produce algún tipo de error, aún podremos ver el mensaje de error en la pantalla:
$ ls -l inexistente.txt> /dev /null ls: no se puede acceder 'inexistirfile.txt ': no hay dicho archivo o directorio
Esto sucede porque, como se dijo anteriormente, stdout
y stderr
Los descriptores están completamente separados entre sí. ¿Qué podemos hacer, entonces, para redirigirlos a ambos?? Hay dos sintaxis que podemos usar para lograr esta tarea: la primera, que funciona incluso en versiones antiguas del shell, es lo siguiente:
LS -L> Salida.txt 2> y 1
Qué hemos hecho? En primer lugar, redirigimos el stdout
del comando a la salida.archivo txt, tal como lo hicimos antes, luego redirigimos el stderr
hacia stdout
. Observe cómo hicimos referencia a los descriptores de archivos por sus respectivos números. Para una versión bash razonablemente moderna, podemos usar esta otra sintaxis más optimizada:
ls -l &> salida.TXT
Redirigir la salida estándar al error estándar
Imagine que está escribiendo un script y desea manejar un caso cuando falla una instrucción específica, mostrando al usuario un mensaje de error. ¿Cómo lograrías esto?? Lo primero que me viene a la mente es solo eco
el mensaje buscado y luego salir del script con el código de error apropiado. Esto estaría perfectamente bien, pero pregúntese, sobre qué descriptor se 'enviará' este mensaje '? Es el stdout
del eco
comando, pero al mismo tiempo, si vemos las cosas desde la perspectiva del script, como un mensaje de error, debe usar el stderr
descriptor. Lo que queremos hacer aquí es redirigir stdout
a stderr
. Usamos la siguiente sintaxis para realizar la tarea:
hacer eco "ocurrió un error, adiós!"> Y 2
Seguramente no es el más útil de los mensajes de error, pero es suficiente para nuestro ejemplo.
Redirigir la entrada estándar
Como dijimos antes, por defecto, la entrada estándar se asocia al teclado, pero utilizando el <
Operador, podemos hacer algunos programas para aceptar la información de otras fuentes. Veamos un ejemplo rápido usando el TR
comando (como probablemente sepa TR
se usa para eliminar o traducir caracteres). Normalmente funciona de esta manera:
tr 'goot tay!'T D
Das TR
una cadena, primero especificando el personaje que desea cambiar, y luego el que debe usar para sustituirlo. En este caso pasamos la cadena 'Goot Tay!'Directamente, utilizando el teclado: se traducirá a' Buen día!'. Lo que haremos para demostrar stdin
redirección, es escribir la cadena en un archivo y luego redirigir el contenido del archivo al stdin
del TR
dominio.
Primero escribimos 'Goot Tay!'A la salida.archivo txt
$ echo 'goot tay!'> Salida.TXT
Luego enviamos su contenido al stdin
de TR
:
$ tr < output.txt t d good day!
Como puede ver, todo salió como se esperaba, y se ha impreso un buen mensaje en la pantalla.
Tuberías
Usando el operador de tubería |
Podemos encadenar múltiples comandos juntos, para que el stdout
del comando a la izquierda del operador se pasa al stdin
del comando a la derecha. Podemos demostrar rápidamente esto, utilizando el TR
comando de nuevo:
Día de $ echo!'| tr t d buen día!
Qué pasó? La salida estándar del comando echo (que consiste en la cadena 'Goot Tay!') es con tuberías
a la entrada estándar del TR
comando, que traduce la cadena. Finalmente vemos TR
Salida estándar en la pantalla. Pero, por supuesto, la tubería puede continuar. Imagina que solo queremos que se muestre la palabra 'bueno':
$ echo 'goot tay!'| TR T D | cortar -f 1 -d "
Lo que hemos hecho aquí es agregar el cortar
comandar a la tubería, pasando el stdout
de TR
a su stdin
. El cortar
El comando usa el espacio como delimitador (-d
cambiar) y selecciona solo el primer campo, devolviendo la cadena 'buena'.
Usando Tee
El tee
El comando lee la entrada estándar y la redirige tanto a la salida estándar como a un archivo al mismo tiempo, lo que hace posible crear una 't' en nuestra tubería. Reutilicemos el ejemplo anterior, esta vez enviando el resultado intermedio ('Buen día!') también a la salida.archivo txt:
$ echo 'goot tay!'| TR T D | salida.txt | cortar -f 1 -d "
La salida en la pantalla será la misma que antes ('buena'), pero si leemos la salida.archivo txt, podemos ver que el 'buen día!'La cadena se le ha escrito. Esto es porque 'buen día!'¿La salida estándar fluía en la tubería cuando insertamos nuestro tee
.
Tee
también es útil es algunas circunstancias específicas. Por ejemplo, si intenta 'hacer eco' algo a un archivo que necesita privilegios raíz para escribir, notará que las cosas no irán como se esperaba:
$ sudo echo "linuxconfig.org "> protegido.txt -bash: protegido.txt: permiso denegado
Qué pasó? Probablemente esperaba que el comando tuviera éxito, porque lo prefirió con sudo, pero de todos modos falló. Esto es porque acabas de ejecutar el eco
Comando con privilegios, pero eso no le dio permisos de escritura en el archivo. Probemos de esta manera en su lugar:
$ echo "Linuxconfig.org "| Sudo Tee protegido.txt> /dev /null
Aquí ejecutamos Echo como un usuario normal, pero la redirección en sí se realiza con privilegios raíz, por lo que esta vez el comando tiene éxito. También agregamos una redirección adicional a /dev/nulo
, Porque no necesitábamos que se muestre la salida en la pantalla.
Tenga en cuenta que con esta técnica, la salida no se agregará al archivo de destino: este último se sobrescribirá y se perderá su contenido anterior. Para agregar al archivo, debemos agregar el -a
cambiar a tee
(abreviatura de -append).
Ten cuidado, solo un poco de distracción aquí puede causar cosas horribles!
Tutoriales de Linux relacionados:
- Cosas para instalar en Ubuntu 20.04
- Una introducción a la automatización, herramientas y técnicas de Linux
- Introducción a las tuberías con nombre en Bash Shell
- Manejo de la entrada del usuario en scripts bash
- Cosas que hacer después de instalar Ubuntu 20.04 fossa focal Linux
- Mastering Bash Script Loops
- Archivos de configuración de Linux: los 30 principales más importantes
- Mint 20: Mejor que Ubuntu y Microsoft Windows?
- ¿Puede Linux obtener virus?? Explorando la vulnerabilidad de Linux ..
- Descarga de Linux