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)