Linux en Español

Scripting de Shell Parte4 – Entrada, salida y redirección

En la publicación anterior, hablamos acerca de parametros y opciones en detalle, hoy discutiremos acerca de algo muy importante en los scripts de shell que es Entrada, Salida y Redirección.

Puedes mostrar el resultado de tus scripts de shell de dos maneras:


  • Mostrar la salida en la pantalla.
  • Enviar salida a un archivo.

Descriptores de archivo estándar

Todo es un archivo en Linux y esto incluye la entrada y salida.

Cada proceso puede tener 9 descriptores de archivos abiertos al mismo tiempo. Los descriptores de archivo 0, 1, 2 se guardan para el uso del shell de bash.

0              STDIN.

1              STDOUT.

2              STDERR.

Puedes utilizar los descriptores de archivo anteriores para controlar la entrada y la salida.

Necesitas entender completamente estos tres porque son la columna vertebral de tus scripts de shell. Así que vamos a estudiar cada uno de estos en detalle.

 


STDIN

STDIN significa entrada estándar la cual es el teclado por defecto.

Puedes reemplazar el STDIN con un archivo utilizando el símbolo de redirección de entrada (<), envía los datos como caracteres del teclado. ¡No hay magia!

Cuando escribes el comando cat sin nada, este acepta texto de la entrada de STDIN. Cualquier línea que escribas, el comando cat la imprimirá en pantalla.

STDOUT

Esto representa la salida estándar la cual es la pantalla por defecto.

Puede redirigir la salida a un archivo utilizando el símbolo >>.

Si tenemos un archivo que contiene datos, puedes agregarle mas datos utilizando usando este símbolo:

pwd >> myfile

La salida generada por pwd se agrega a myfile sin eliminar el contenido existente.

Entrada, salida y redirección

El siguiente comando intenta redirigir el resultado a un archivo utilizando el simbolo >.

ls l xfile > myfile

error de redireccionamiento

No tengo un archivo llamado xfile en mi PC, y eso genera un error que se envía a STDERR.

 


STDERR

Este descriptor de archivo es la salida de error estándar del shell que se envía a la pantalla de forma predeterminada.

Si necesitas redirigir los errores a un archivo de registro en lugar de enviarlo a la pantalla, puedes redirigir los errores utilizando el símbolo de redirección.


Redirigir Errores

Podemos redirigir los errores colocando el descriptor de archivo 2 antes del símbolo de redirección como este:

ls -l xfile 2>myfile

cat ./myfile

error de redireccionamiento al archivo

Como puedes ver, el error ahora está en el archivo y nada aparece en la pantalla.

Redirigir Errores y Salida Normal

Para redirigir los errores y la salida normal, debemos preceder a cada uno con el descriptor de archivo adecuado de esta manera:

ls l myfile xfile anotherfile 2> errorcontent 1> correctcontent

Redirigir errores y salida normal

El resultado del comando ls se envía al archivo correctcontent utilizando el símbolo 1>. Y los mensajes de error se enviaron al archivo errorcontent con el símbolo 2>.

Puedes redirigir la salida normal y los errores al mismo archivo usando el símbolo &> como este::

ls l myfile xfile anotherfile &> content

redirigir todo a archivo

Todos los errores y la salida normal se redirigen al contenido nombrado del archivo.

 


Redirección de salida

Hay dos formas para la redirección de salida:

  • Redirección temporal.
  • Redirección permanente.

Redirecciones temporales

Las redirecciones temporales utilizan el símbolo> & 2 de esta manera:


Redirecciones temporales

Entonces, al ejecutar, veremos ambas líneas impresas normalmente porque, como sabemos, los errores van a la pantalla de manera predeterminada.

Puedes redirigir los errores a un archivo de la siguiente forma:

./myscript 2> myfile

redirigir error a archivo

¡La creación de scripts de Shell es impresionante! La salida normal se envía a la pantalla, mientras que el mensaje de echo que tiene el símbolo> & 2 envía errores al archivo.

Redirecciones permanentes

Si tienes muchos datos que necesitan ser redirigidos, puedes hacer una redirección permanente utilizando el comando exec de esta manera:


redirigir todo a archivo

Si observamos el archivo outfile, veremos el resultado de las líneas de echo.

Redirigimos el STDOUT al principio, ¿qué tal en medio de un script como el que se muestra a continuación: ?


redirección permanente

El comando exec redirige todos los errores al archivo myerror, y la salida estándar se envía a la pantalla.

La sentencia  exec 1>myfile se usa para redirigir el resultado al archivo myfile y, finalmente, los errores van al archivo myerror con el símbolo> & 2.

 

Redireccionar la entrada

Puedes redirigir la entrada a un archivo en lugar de STDIN usando el comando exec de la siguiente forma:

exec 0< myfile

Este comando le dice al shell que tome la entrada de un archivo llamado myfile en lugar de STDIN, aquí hay un ejemplo:


Redireccionar la entrada

La creación de scripts en Shell es fácil.

Ya sabes cómo utilizar el comando read para obtener la entrada del usuario. Si rediriges el STDIN a un archivo, el comando read intentará leer desde el STDIN el cual apunta al archivo.

Algunos administradores de sistemas Linux usan esta técnica para leer los archivos de registro para su procesamiento, mas adelante discutiremos más formas de leer el registro de manera profesional en las próximas publicaciones.

 


Crear una Redirección Personalizada

Hay 9 descriptores de archivos, de los cuales solo utilizamos 3 de ellos para la entrada, salida y error.

Los seis descriptores de archivo restantes están disponibles para su utilizacion en la redirección de entrada y salida.

El comando exec se usa para asignar un descriptor de archivo para un resultado como este:


Crear una redirección personalizada

 

Crear Descriptores de Archivos de Entrada

Para redirigir los descriptores de archivos de entrada realiza lo siguiente:

1- Guarda el STDIN en otro descriptor de archivo.

2- Redirigirlo a un archivo.

3- Revertir STDIN a su ubicación original.

Mira el siguiente código para entender estos pasos:


Crear descriptores de archivos de entrada

El STDIN se guarda en el descriptor de archivo 7 y el STDIN se redirige a un archivo.

El STDIN volvió a su ubicación original después de iterar sobre líneas de archivo.

El último comando de lectura es solo para asegurarse de que se restablece STDIN y puede usar el teclado normalmente.

 

Cerrar descriptores de archivos

Los descriptores de archivo se cierran automáticamente cuando se termina el script. Si quieres cerrar el descriptor del archivo, redirigelo a este símbolo &- y se cerrará.


Cerrar descriptores de archivos

Como puede ver, da error al descriptor de archivo incorrecto porque ya no existe.

 

Comando lsof

El comando lsof se utiliza para enumerar todos los archivos abiertos en el sistema y los procesos en segundo plano.

En muchos sistemas Linux como Fedora, el comando lsof se encuentra en / usr / sbin.

Estas son algunas de las opciones importantes para el comando lsof:

-p: para la identificación del proceso.

-d: para el descriptor de archivo.

Puedes obtener el PID del proceso usando la variable $$.

lista descriptores de archivos

El -a se usa para combinar los resultados de las opciones -p y -d.

Ahora, probando el comando desde un script:


listar descriptores personalizados

El script de shell crea los descriptores de archivo 4 y 5 para escribir y 6 para leer.

 

Supresión de Salida de Comando

A veces no quieres ver ningún resultado. Redirigimos la salida al agujero negro que es /dev/null.

Por ejemplo, podemos suprimir errores como este:

ls -al badfile anotherfile 2> /dev/null

Y esta idea también se usa cuando quieres truncar un archivo sin eliminarlo por completo.

cat /dev/null > myfile

Ahora comprendes la entrada, salida, cómo redirigirlos, cómo crear tu propio descriptor de archivo y redirigir a este.

Espero que lo disfrutes. vuelve pronto.

Gracias.

Mokhtar Ebrahim
Estoy trabajando como administrador de sistemas Linux desde 2010. Soy responsable de mantener, proteger y solucionar problemas de servidores Linux para múltiples clientes de todo el mundo. Me encanta escribir guiones de shell y Python para automatizar mi trabajo.

Deja un comentario

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