103.4 - Uso de secuencias de texto, tuberías y redireccionamientos
Last updated
Last updated
Importancia
4
Descripción
El candidato debe ser capaz de redireccionar secuencias de texto y conectarlas para procesar la información de forma eficiente. Estas tareas incluyen: la redirección de la entrada estándar, la salida estándar y el error estándar; el uso de tuberías para enviar la salida de un comando a la entrada de otro; el uso de la salida de un comando como argumento para otro comando, así como el envío de la salida de un comando simultáneamente a la salida estándar y a un archivo.
Redireccionar la entrada estándar (stdin), la salida estándar (stdout) y el error estándar (stderr).
Utilizar tuberías para enviar la salida de un comando a la entrada de otro.
Usar la salida de un comando como argumento de otro comando.
Enviar la salida de un comando a stdouty a un archivo simultáneamente.
Los tres canales de comunicación estándar que vimos en el (stdin, stdnout y stdnerr) permiten a los programadores escribir código que lee y escribe datos sin preocuparse por el tipo de medio del que proviene o al que va.
Por ejemplo, si un programa necesita un conjunto de datos como entrada, solo puede solicitar datos de la stdin (0)
y lo que se esté utilizando como entrada estándar proporcionará esos datos y del mismo modo, la formas más sencilla que tiene un programa para mostrar su salida es escribirlo en la stndout (1).
En una sesión de shell estándar, el teclado se define como stdin
y la pantalla del monitor se define como stdout
y stderr
, el shell Bash tiene la capacidad de reasignar los canales de comunicación al cargar un programa y permite, por ejemplo, anular la pantalla como salida estándar y usar un archivo en el sistema de archivos local como stdout.
Tal y como hemos ido viendo, la reasignación del descriptor de archivo de un canal en el entorno de shell se denomina redirect y se define mediante un caracter especial dentro de la línea de comandos.
Por ejemplo, para redirigir la salida estándar de un proceso a un archivo, el símbolo mayor que > se coloca al final del comando y sigue la ruta al archivo que recibirá la salida redirigida:
Desde la perspectiva del programador, el uso de descriptores de archivos evita tener que lidiar con el análisis de opciones y las rutas del sistema de archivos. El mismo descriptor de archivo puede incluso usarse como entrada y salida y en este caso, el descriptor de archivo se define en la línea de comandos con símbolos menores y mayores que, como en 3<>/tmp/error.txt
.
Otra forma de redirigir la entrada involucra los métodos Here Document (<<) y Here String (<<<).
tee
El |
le dice al shell que inicie todos los comandos distintos al mismo tiempo y que conecte la salida del comando anterior a la entrada del siguiente comando, de izquierda a derecha siendo el objetivo otro proceso, no una ruta del sistema de archivos, un descriptor de archivo o un documento.. Por ejemplo, con cat /proc/cpuinfo | wc
en lugar de utilizar redireccionamientos, el contenido del archivo /proc/cpuinfo
enviado a la salida estándar por cat
puede canalizarse al stdin de wc
.
Las tuberías se pueden combinar con redireccionamientos en la misma línea de comando. El ejemplo anterior se puede reescribir en una forma más simple:
Las tuberías y redirecciones son exclusivas, es decir, una fuente puede asignarse a un solo destino, sin embargo, es posible redirigir una salida a un archivo y aún verlo en la pantalla con tee
. Es un bifurcador, coge una estándar output y la redirige a dos sitios a la vez.
Para hacerlo, el primer programa envía su salida al stdin de tee
y se le proporciona un nombre de archivo a este último para almacenar los datos:
Solo la salida estándar de un proceso es capturada por una tee, por lo que:
Una aplicación muy practica de este comando es:
xargs
Otro método para capturar la salida de un comando es command substitution, al colocar un comando dentro de las comillas inversas (el acento abierto para nosotros) o bien poniendo el comando dentro de $()
, Bash lo reemplaza con su stdout (1).
Por ejemplo:
Dependiendo de la salida generada por el comando reemplazado, la sustitución del comando incorporado puede no ser apropiada por ello, un método más sofisticado para usar la salida de un programa como argumento de otro programa emplea un intermediario llamado xargs
. Este es un adaptador, permite hacer compatibles las salidas de un comando con las entradas de otro.
Resulta especialmente útil si estás procesando un gran número de archivos y necesitas realizar ciertas tareas de forma repetitiva, su definición es la siguiente:
En este ejemplo, xargs
se utliza con el comando de Linux find
y el comando de Linux rm
. Como resultado, todos los archivos con la extensión .txt se eliminan del sistema de archivos del ordenador, así que cuidadito con este comando.
Vamos a ver un par más de ejemplos sencillos:
El siguiente ejemplo muestra xargs
ejecutando el programa identify
con argumentos proporcionados por el programa find
:
En el ejemplo, xargs
tomó todas las rutas listadas por find
y las puso como argumentos para identify
, que luego muestra la información para cada archivo formateado como lo requiere la opción -format
(los archivos encontrados por find
en el ejemplo son imágenes que contienen el logotipo de distribución en un sistema de archivos Debian).
La opción -n 1
requiere que xargs
ejecute el comando dado con un solo argumento a la vez; en el caso del ejemplo, en lugar de pasar todas las rutas encontradas por find
como una lista de argumentos para identify
, usar xargs -n 1
ejecutaría el comando identify
para cada ruta por separado.
El uso de -n 2
ejecutaría identify
con dos rutas como argumentos, -n 3
con tres rutas como argumentos y así sucesivamente.
De manera similar, cuando xargs
procesa contenidos de varias líneas, como es el caso de la entrada proporcionada por find
, la opción -L
puede usarse para limitar cuántas líneas se usarán como argumentos por ejecución de comando.
Dónde:
-print0
-> indica a find
que use un carácter nulo entre cada entrada para que la lista pueda ser analizada correctamente por xargs
(se suprimió la salida) por si las rutas tienen caracteres de espacio. Esta se debe poner por cada criterio de búsqueda.
-0
le dice a xargs
que el carácter nulo debe usarse como separador así, las rutas proporcionadas por find
se analizan correctamente incluso si tienen caracteres en blanco u otros caracteres especiales.
du
se usa para averiguar el espacio ocupado en disco de cada archivo encontrado
sort -n
para ordenar los resultados por tamaño.