
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:
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. ]
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 acommand 2> file
: envía una salida de error acommand 2>&1
: Envía la salida de error a la salida estándarcommand > file 2>&1
: envía la salida estándar y la salida de error a un archivocommand &> file
: envía la salida estándar y la salida de error a un archivocommand 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 archivocommand 2>> file
: Agrega salida de error a un archivocommand >> file 2>&1
: Agrega salida estándar y salida de error a un archivocommand &>> file
: Agrega salida estándar y salida de error a un archivocommand 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 desdecommand << 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:
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.