Tutoriales

Cómo manipular archivos con redirección de shell y canalizaciones en Linux

El manejo de archivos, directorios, entornos de línea de comandos y documentación es un conocimiento esencial para los administradores de sistemas. Comprender los descriptores de archivos y cómo se relacionan con estos temas mejora sus habilidades de administrador de sistemas. Este artículo cubre tres descriptores de archivos estándar de Linux para manipular archivos a través de canalizaciones y redirección de shell.

¿Qué son los descriptores de archivos?

En palabras simples, los descriptores de archivos son enteros (números) que actúan como identificadores únicos para un archivo abierto (u otro recurso de E/S) en un sistema Linux. Recuerde, en los sistemas tipo Unix, «todo es un descriptor de archivo o un proceso» (citando a Linus Torvalds), o incluso «todo puede tener un descriptor de archivo» (citando a Neil Brown). Es importante y útil comprender cómo funcionan los denominados tres descriptores de archivo estándar, o secuencias estándar, porque todos los procesos utilizan estos canales para las operaciones de entrada y salida.

Para evitar alargar demasiado este artículo, le recomiendo que lea con más detalle la documentación de GNU sobre flujos y descriptores de archivos, descriptores y flujos, y puertos y descriptores de archivos. Aquí hay una descripción general rápida y simple de los conceptos.

Considere la siguiente imagen:

(Alexón Oliveira, CC BY-4.0)

Las interacciones del usuario con el sistema se ingresan a través de la entrada estándar (stdin), que es el canal/flujo 0, generalmente mediante el uso de un teclado. Luego, cualquier comando ejecutado a través de un shell interactivo se conecta a un terminal de texto en el que se ejecuta el shell y envía la salida a través de la salida estándar (stdout), que es el canal/flujo 1, si está bien, o a través de un error estándar (stderr ), que es el canal/transmisión 2 si es no ESTÁ BIEN. La salida estándar suele ser el terminal que muestra el monitor. Hay otros canales y flujos (3 y más) que cualquier proceso puede usar y no tienen una entrada o salida predeterminada.

[ Download the free guide to installing applications on Linux. ]

Publicaciones relacionadas

Redirección de E/S de shell

Puede manipular y cambiar el comportamiento predeterminado de estos tres descriptores de archivo básicos aprovechando la redirección y las canalizaciones. Por ejemplo, puede cambiar su entrada de un teclado a un archivo. En lugar de recibir mensajes en su terminal, puede redirigirlos a un archivo o incluso descartar mensajes de error en lugar de verlos en su monitor. También puede redirigir su salida a la terminal y un archivo simultáneamente. Incluso puede procesar la salida de un comando como una entrada para otro comando.

Hay tres redirectores con los que trabajar: >, >>y <. La siguiente información describe cada uno:

Redirección con >

  • command > file: Envía la salida estándar a
  • command 2> file: envía una salida de error a
  • command 2>&1: Envía la salida de error a la salida estándar
  • command > file 2>&1: envía la salida estándar y la salida de error a un archivo
  • command &> file: envía la salida estándar y la salida de error a un archivo
  • command 2>&1 > file: Envía la salida de error a la entrada estándar y la entrada estándar a un archivo

Agregar con >>

  • command >> file: Agrega salida estándar a un archivo
  • command 2>> file: Agrega salida de error a un archivo
  • command >> file 2>&1: Agrega salida estándar y salida de error a un archivo
  • command &>> file: Agrega salida estándar y salida de error a un archivo
  • command 2>&1 >> file: envía la salida de error a la entrada estándar y agrega la entrada estándar a un archivo

Redirigir con

  • command < input: Alimenta una entrada de comando desde
  • command << input: Alimenta un comando o programa interactivo con una lista definida por un delimitador; esto se conoce como un documento aquí (heredoc)
  • command <<< input: Alimenta un comando con ; esto se conoce como una cadena aquí

[ Download the free Bash shell scripting cheat sheet. ]

Ejemplos de E/S de Shell

Estos son algunos ejemplos del uso de cada operador en el orden presentado anteriormente.

Redirigir la salida estándar para un comando dado a un archivo:

$ echo "Enable Sysadmin" > myfile
$ cat myfile
Enable Sysadmin

Redirigir la salida de error para un comando dado a un archivo:

$ ls /root 2> myfile
$  cat myfile
ls: cannot open directory '/root': permission denied

Redirigir la salida de error para un comando dado a la salida estándar, la terminal:

$ ls /root 2>&1
ls: cannot open directory 'root/': Permission denied

Redirigir la salida estándar y la salida de error para un comando dado a un archivo:

$ find /usr -name ls > myfile 2>&1
$ cat myfile
/usr/bin/ls
find: '/usr/share/polkit-1/rules.d': Permission denied
find: '/usr/share/selinux/targeted/default/active': Permission denied
find: '/usr/libexec/initscripts/legacy-actions/auditd': Permission denied
$
$ find /usr -name ls &> myfile
$ cat myfile
/usr/bin/ls
find: '/usr/share/polkit-1/rules.d': Permission denied
find: '/usr/share/selinux/targeted/default/active': Permission denied
find: '/usr/libexec/initscripts/legacy-actions/auditd': Permission denied

Redirigir la salida de error para un comando dado a la salida estándar, el terminal y la salida estándar para el mismo comando a un archivo:

$ find /usr -name ls 2>&1 > myfile
find: '/usr/share/polkit-1/rules.d': Permission denied
find: '/usr/share/selinux/targeted/default/active': Permission denied
find: '/usr/libexec/initscripts/legacy-actions/auditd': Permission denied
$ cat myfile
/usr/bin/ls

Agregue la salida estándar para un comando dado a un archivo existente (si el archivo no existe, lo crea, al igual que el > el operador lo hace):

$ cat myfile
/usr/bin/ls
$ echo "Enable Sysadmin" >> myfile
$ cat myfile
/usr/bin/ls
Enable Sysadmin

Agregue la salida de error para un comando dado a un archivo existente:

$ ls /root 2>> myfile
$ cat myfile
/usr/bin/ls
Enable Sysadmin
ls: cannot open directory '/root': Permission denied

Agregue tanto la salida estándar como la salida de error para un comando dado a un archivo existente:

$ find /usr -name cd >> myfile 2>&1
$ cat myfile
/usr/bin/ls
Enable Sysadmin
ls: cannot open directory '/root': Permission denied
/usr/bin/cd
/usr/lib/.build-id/cd
/usr/share/X11/xkb/symbols/cd
find: '/usr/share/polkit-1/rules.d': Permission denied
find: '/usr/share/selinux/targeted/default/active': Permission denied
find: '/usr/libexec/initscripts/legacy-actions/auditd': Permission denied
$
$ find /usr -name cd &>> myfile
$ cat myfile
/usr/bin/ls
Enable Sysadmin
ls: cannot open directory '/root': Permission denied
/usr/bin/cd
/usr/lib/.build-id/cd
/usr/share/X11/xkb/symbols/cd
find: '/usr/share/polkit-1/rules.d': Permission denied
find: '/usr/share/selinux/targeted/default/active': Permission denied

Redirija la salida de error para un comando dado a la salida estándar, el terminal, y agregue la salida estándar para el mismo comando a un archivo existente:

$ find /usr -name cd 2>&1 >> myfile
find: '/usr/share/polkit-1/rules.d': Permission denied
find: '/usr/share/selinux/targeted/default/active': Permission denied
find: '/usr/libexec/initscripts/legacy-actions/auditd': Permission denied
$ cat myfile
/usr/bin/ls
Enable Sysadmin
ls: cannot open directory '/root': Permission denied
/usr/bin/cd
/usr/lib/.build-id/cd
/usr/share/X11/xkb/symbols/cd
find: '/usr/share/polkit-1/rules.d': Permission denied
find: '/usr/share/selinux/targeted/default/active': Permission denied
find: '/usr/libexec/initscripts/legacy-actions/auditd': Permission denied
/usr/bin/cd
/usr/lib/.build-id/cd
/usr/share/X11/xkb/symbols/cd
find: '/usr/share/polkit-1/rules.d': Permission denied
find: '/usr/share/selinux/targeted/default/active': Permission denied

Alimente un comando con una entrada no estándar, en este caso, un archivo:

$ sort < myfile
/usr/bin/cd
/usr/bin/cd
/usr/bin/cd
/usr/bin/ls
/usr/bin/.build-id/cd
/usr/bin/.build-id/cd
/usr/bin/.build-id/cd
/usr/share/X11/xkb/symbols/cd
/usr/share/X11/xkb/symbols/cd
/usr/share/X11/xkb/symbols/cd
Enable Sysadmin
find: '/usr/libexec/initscripts/legacy-actions/auditd': Permission denied
find: '/usr/libexec/initscripts/legacy-actions/auditd': Permission denied
find: '/usr/share/polkit-1/rules.d': Permission denied
find: '/usr/share/polkit-1/rules.d': Permission denied
find: '/usr/share/selinux/targeted/default/active': Permission denied
find: '/usr/share/selinux/targeted/default/active': Permission denied
ls: cannot open directory '/root': Permission denied

Alimente un comando con una entrada dinámica no estándar, en este caso, la entrada es una lista de cadenas que necesitan un delimitador de token, y también redirija el resultado a un archivo:

$ cat << EOF
> Enable
> Sysadmin
> EOF
Enable
Sysadmin
$
$ cat << EOF > myfile
> Enable
> Sysadmin
> EOF
$ cat myfile
Enable
Sysadmin
$

Alimente un comando con una entrada no estándar, en este caso, una cadena, sin necesidad de un delimitador de token:

$ read a b <<< "Sysadmin Enable"
$ echo $b $a
Enable Sysadmin

Tubería de concha

En Linux, una canalización es un mecanismo que permite que dos o más procesos se combinen o ejecuten simultáneamente. Eso significa que la salida del proceso se manejará como una entrada para el siguiente, y así sucesivamente. No se llama tubería por nada: se refiere al concepto de un flujo de proceso que se canaliza a través de una tubería desde un origen hasta un destino.

[ Get the free Grep command cheat sheet. ]

La siguiente imagen da un ejemplo de cómo funciona:

(Alexón Oliveira, CC BY-4.0)

El operador utilizado es la barra vertical de su teclado, el | símbolo. Para "transmitir" un comando a otro, separe los comandos con este operador. Se parece a esto:

$ command1 | command2 | command3

Ejemplos de tuberías de concha

Aquí hay unos ejemplos:

Alimentar el grep comando de entrada con la salida del cat dominio:

$ cat /etc/passwd | grep localuser
localuser:×:1000:1000:Local User:/home/localuser/bin/bash

Redirigir la salida estándar del printf comando a un archivo y luego alimentar el sort comando con el mismo contenido recién creado en el archivo:

$ printf "Sysadmin\nEnable\n" > myfile | sort myfile
Enable
Sysadmin

Compruebe la memoria RAM disponible con el free comando, filtre el resultado para la información de intercambio con el grep comando, y luego use awk para cortar solo la columna "total" de la salida que se exhibirá:

$ free -h | grep Swap | awk '{print $2}'
1.0Gi
$

Hay muchas otras posibilidades. Solo necesita comprender sus necesidades y usar la canalización en consecuencia para obtener lo que desea de estas combinaciones.

Envolver

Como administrador de sistemas, es crucial que comprenda los conceptos detrás de los descriptores de archivos y sepa cómo usar los operadores disponibles para ejecutar redirecciones y canalizaciones en un shell como Bash para que pueda manipular las entradas y salidas estándar en su sistema. Esta habilidad le brinda un conjunto completo de recursos y posibilidades para agilizar, facilitar, mejorar y automatizar la administración de su sistema. Espero que este artículo lo ayude a comprender este tema, lo ayude en su ruta de certificación de Linux y aumente su conocimiento general de administrador de sistemas.

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba