Introducción a las redirecciones de shell de Bash

Introducción a las redirecciones de shell de Bash

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