Estamos de vuelta

Bienvenidos a esta nueva entrega de Mastering en Bash, los que ya nos siguen de las anteriores espero que disfrutéis con este post, si acabas de acceder y no tienes ni idea de que va esto, puedes ver nuestro viejo post Primeros Pasos. En el siguiente post veremos que son los redireccionamientos y las tuberías antes de comenzar con scripting.

¿Qué es un redireccionamiento?

Un redireccionamiento, como su propio nombre indica lo que hace es una redirección a un determinado sitio. En nuestro caso, utilizaremos los redireccionamientos para gestionar tanto las salidas, como entradas así como los niveles de error que de un comando o una aplicación para utilizarlos en nuestro beneficio.

Podemos decirle a un comando, que si tiene un error X, no lo muestre en pantalla y lo rediriga a un archivo de texto para que haga de log. También podemos añadir una frase, sentencias... a un archivo ya existente o en caso de que no exista que lo cree; comentar el número de palabras que tiene un texto... y un sin fin de cosas más.

Operadores de redireccionamiento

Estos son los operadores que utilizaremos en la elaboración de scripts sobre todo, capítulo que introduciremos estos días con las siguientes entregas.

Operador Descripción
> Redirecciona una salida hacia un archivo o comando. Si el archivo no existe, lo crea, y si existe, lo sobreescribe
>> Igual que el anterior, pero si el archivo existe no lo destruye, añade la salida después de la última línea
< Redirecciona una entrada hacia un comando para que este emita una salida (si lo hace), puede ser la salida de un comando hacia otro, un fichero...
<< Redirecciona el contenido de un fichero hasta que se encuentre la palabra especificada en la redirección para finalizarla

Canales

Nuestra terminal tiene una serie de canales por los que se toman la entrada, salida y errores.

Canal Descripción Ubicación
0 Es el canal por defecto de la entrada estándar /dev/stdin
1 Especifica la salida de un comando. Por ejemplo ls 2> file.txt /dev/stdout
2 Muestra la presencia de errores. Por ejemplo ls -lklk 3> error.txt /dev/stderr

Ejemplos

Almacenar la salida del comando ls -al en un fichero lista.txt:

ls -al > lista.txt

Veremos como no se muestra nada en pantalla, pero se ha creado el archivo lista.txt

Mostrar el contenido de lista.txt

cat lista.txt
total 568
drwxrwxr-x.  2 sincorchetes sincorchetes  4096 May  2 01:43 .
drwx------. 55 sincorchetes sincorchetes  4096 May  2 17:10 ..
-rw-rw-r--.  1 sincorchetes sincorchetes 25277 May  1 12:55 20E2MC8SVX-9423.png
-rw-rw-r--.  1 sincorchetes sincorchetes 25277 May  1 12:55 36712GXM3C-865.png
-rw-rw-r--.  1 sincorchetes sincorchetes 25277 May  1 12:55 4SASA426RU.png
-rw-rw-r--.  1 sincorchetes sincorchetes 25277 May  2 01:43 5ODFPGZXOI-25637.png
-rw-rw-r--.  1 sincorchetes sincorchetes 25277 May  2 01:43 5PYBWDCZWK.png
-rw-rw-r--.  1 sincorchetes sincorchetes 25277 May  1 12:55 6A21WJKHWL.png

NOTA: Recordemos que el operador > sobreescribe todo lo que haya, si queremos añadir información nueva al archivo debemos utilizar el operador >>

ls -al >> lista.txt
cat lista.txt
total 568
drwxrwxr-x.  2 sincorchetes sincorchetes  4096 May  2 01:43 .
drwx------. 55 sincorchetes sincorchetes  4096 May  2 17:10 ..
-rw-rw-r--.  1 sincorchetes sincorchetes 25277 May  1 12:55 20E2MC8SVX-9423.png
-rw-rw-r--.  1 sincorchetes sincorchetes 25277 May  1 12:55 36712GXM3C-865.png
-rw-rw-r--.  1 sincorchetes sincorchetes 25277 May  1 12:55 4SASA426RU.png
-rw-rw-r--.  1 sincorchetes sincorchetes 25277 May  2 01:43 5ODFPGZXOI-25637.png
-rw-rw-r--.  1 sincorchetes sincorchetes 25277 May  2 01:43 5PYBWDCZWK.png
-rw-rw-r--.  1 sincorchetes sincorchetes 25277 May  1 12:55 6A21WJKHWL.png
-rw-rw-r--.  1 sincorchetes sincorchetes 25277 May  2 01:43 6FG92BUEDM-12977.png
-rw-rw-r--.  1 sincorchetes sincorchetes 25277 May  2 01:43 A6XZFBO1TK-18309.png
-rw-rw-r--.  1 sincorchetes sincorchetes 25277 May  2 01:43 FBEBPAR2O9-16637.png
-rw-rw-r--.  1 sincorchetes sincorchetes 25277 May  2 01:43 FP9EZ05Y3E-16753.png
-rw-rw-r--.  1 sincorchetes sincorchetes 25277 May  1 12:55 FZRD6D42BI-875.png

Guardar todos los errores que surjan en la ejecución del programa

cat ks 2> error.txt

No se mostrará nada en pantalla, pero nos daremos cuenta el error que nos da cat(1) en el fichero que se ha creado llamado error.txt

cat error.txt
cat: jk: No such file or directory

Mostrar en pantalla tanto la salida estándar como los errores

ls -al 2>&1 info.txt

Guardar en un fichero tanto la salida como los errores

ls -al 2>&1 info.txt > file.txt

Calcular las líneas que tiene un fichero de texto

wc -l < file.text

Añadir información a un fichero e interrumpirlo utilizando una palabra clave declarada por el usuario

cat add << EOF

Crear un fichero de texto utilizando la canal de entrada y utilizando una palabra clave para finalizar la adicción

cat > create_text.txt << EOF

Adherir la salida estándar de múltiples textos y redireccionándolos a un archivo

cat lista.txt error.txt info.txt create_text.txt > salida_multiple

Tuberías

Una tubería es una secuencia de uno o más comandos separados por operadores de control como | o &. Suelen utilizarse mucho junto con el comando grep(1), egrep(1) y fgrep(1) para filtrar resultados, o el comando cut(1) para recortar la salida estándar, generalmente producida por comandos. Estos comandos que hemos mencionado les dedicaremos un post especial debido a la importancia de los mismos. Sobre todo cuando demos scripting más adelante.

Este es el formato de una tubería común:

comando [+parámetros] | ó & [comando1]

Ejemplos

Ejemplos basándonos en esta estructura de directorios:

.
├── fichero-0
├── fichero-1
├── fichero-10
├── fichero-11
├── fichero-12
├── fichero-13
├── fichero-14
├── fichero-15
├── fichero-16
├── fichero-17
├── fichero-18
├── fichero-19
├── fichero-2
├── fichero-3
├── fichero-4
├── fichero-5
├── fichero-6
├── fichero-7
├── fichero-8
└── fichero-9

Mostrar un valor relacionado con dmesg(1)

dmesg |grep Bluetooth

[   23.265232] Bluetooth: Core ver 2.22
[   23.265247] Bluetooth: HCI device and connection manager initialized
[   23.265250] Bluetooth: HCI socket layer initialized
[   23.265251] Bluetooth: L2CAP socket layer initialized
[   23.265256] Bluetooth: SCO socket layer initialized
[   24.078796] Bluetooth: hci0: read Intel version: 370810225019140f18
[   24.078797] Bluetooth: hci0: Intel device is already patched. patch num: 18
[   35.047963] Bluetooth: BNEP (Ethernet Emulation) ver 1.3
[   35.047967] Bluetooth: BNEP filters: protocol multicast
[   35.047974] Bluetooth: BNEP socket layer initialized
[   85.419671] Bluetooth: RFCOMM TTY layer initialized
[   85.419675] Bluetooth: RFCOMM socket layer initialized
[   85.419722] Bluetooth: RFCOMM ver 1.11
[60146.891379] Bluetooth: hci0: read Intel version: 370810225019140f00
[60147.826024] Bluetooth: hci0: Intel Bluetooth firmware file: intel/ibt-hw-37.8.10-fw-22.50.19.14.f.bseq
[60148.097374] Bluetooth: hci0: Intel firmware patch completed and activated
[60151.506132] Bluetooth: hci0: command 0x0c56 tx timeout

Mostrar un valor relacionado con la salida del comando lspci(8)

lspci |grep VGA
00:02.0 VGA compatible controller: Intel Corporation Device 591b (rev 04)

Referencias