GNU/Linux >> Tutoriales Linux >  >> Linux

Shell Scripting Parte 4:entrada, salida y redirección

En la publicación anterior, hablamos sobre los parámetros y opciones en detalle. Hoy, hablaremos sobre algo esencial en las secuencias de comandos de shell, que son la entrada, la salida y la redirección.

Puede mostrar el resultado de sus scripts de shell de dos maneras:

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

Descriptores de archivo estándar

Todo es un archivo en Linux, y eso incluye entrada y salida.

Cada proceso puede tener nueve descriptores de archivo abiertos al mismo tiempo. Los descriptores de archivo 0, 1, 2 se conservan para el uso de bash shell.

0              STDIN.

1              SALIDAESTÁNDAR.

2              STDERRR.

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

Debe comprender completamente estos tres porque son como la columna vertebral de sus scripts de shell. Así que vamos a describir cada uno de ellos en detalle.

ESTÁNDAR

STDIN significa entrada estándar, que es el teclado por defecto.

Puede reemplazar el STDIN, que es el teclado y reemplazarlo con un archivo usando el símbolo de redirección de entrada (<), envía los datos como escritura de teclado. ¡¡Sin magia!!

Cuando escribe el comando cat sin nada, acepta la entrada de STDIN. Cualquier línea que escriba, el comando cat imprime esa línea en la pantalla.

SALIDA ESTÁNDAR

STDOUT representa la salida estándar, que es la pantalla predeterminada.

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

Si tenemos un archivo que contiene datos, puede agregarle datos usando este símbolo como este:

pwd >> myfile

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

El siguiente comando intenta redirigir la salida a un archivo usando el símbolo>.

ls –l xfile > myfile

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

STDERR

El shell envía errores a la pantalla por defecto.

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

Errores de redirección

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

ls -l xfile 2>myfile
cat ./myfile

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

Errores de redirección y salida normal

Para redirigir los errores y la salida normal, debe preceder a cada uno con el descriptor de archivo adecuado como este:

ls –l myfile xfile anotherfile 2> errorcontent 1> correctcontent

El resultado del comando ls se envía al archivo de contenido correcto usando 1> símbolo. Y los mensajes de error se enviaron al archivo de contenido de errores mediante 2> símbolo.

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

ls –l myfile xfile anotherfile &> content

aquí, redirigimos los errores y la salida normal a un archivo llamado contenido.

Redireccionamiento de salida

Hay dos formas de redirección de salida:

  • Redireccionamiento temporal.
  • Redireccionamiento permanente.

Redirecciones temporales

Para redirecciones temporales, puede usar el símbolo>&2 como este:

#!/bin/bash

echo "Error message" >&2

echo "Normal message"

Así que si lo ejecutamos, veremos ambas líneas impresas normalmente porque, como sabemos, los errores van a la pantalla por defecto.

Puede redirigir los errores a un archivo como este:

./myscript 2> myfile

¡Las secuencias de comandos de Shell son increíbles! La salida normal se envía a la pantalla, mientras que el mensaje de eco que tiene el símbolo>&2 envía errores al archivo.

Redirecciones permanentes

Si tiene muchos datos que necesitan ser redirigidos, puede tener una redirección permanente usando el comando exec como este:

#!/bin/bash

exec 1>outfile

echo "Permanent redirection"

echo "from a shell to a file."

echo "without redirecting every line"

Si miramos el archivo llamado outfile, veremos la salida de las líneas de eco.

Redirigimos STDOUT al principio, ¿qué tal en medio de un script como este:

#!/bin/bash

exec 2>myerror

echo "Script Begining ..."

echo "Redirecting Output"

exec 1>myfile

echo "Output goes to the myfile"

echo "Output goes to myerror file" >&2

El comando exec redirige todos los errores al archivo myerror y enviamos la salida estándar a la pantalla.

Usamos la instrucción exec 1>myfile para redirigir la salida al archivo myfile y, finalmente, los errores van al archivo myerror usando el símbolo>&2.

Entrada de redirección

Puede redirigir la entrada a un archivo en lugar de STDIN usando un comando exec como este:

exec 0< myfile

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

#!/bin/bash

exec 0<testfile

total=1

while read line; do

	echo "#$total: $line"

	total=$(($total + 1))

done

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

Sabe cómo usar el comando de lectura para obtener información del usuario. Si redirige el STDIN a un archivo, el comando de lectura intentará leer desde STDIN, que apunta al archivo.

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

Crear una redirección personalizada

Sabe que hay nueve descriptores de archivo, solo usa 3 de ellos para entrada, salida y error.

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

Podemos usar el comando exec para asignar un descriptor de archivo para una salida como esta:

#!/bin/bash

exec 3>myfile

echo "This line appears on the screen"

echo "This line stored on myfile" >&3

echo "This line appears on the screen"

Crear descriptores de archivos de entrada

Para redirigir los descriptores del archivo de entrada, haga lo siguiente:

1- Guardar el STDIN en otro descriptor de archivo.

2- Redirigirlo a un archivo.

3- Revertir STDIN a su ubicación original.

Mire el siguiente código para entender estos pasos:

#!/bin/bash

exec 7<&0

exec 0<myfile

total=1

while read line; do

	echo "#$total: $line"

	total=$(($total + 1))

done

exec 0<&7

read -p "Finished? " res

case $res in

y) echo "Goodbye" ;;

n) echo "Sorry, this is the end." ;;

esac

Guardamos el STDIN en el descriptor de archivo 7 y redirigimos el STDIN a un archivo.

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

El último comando de lectura solo para asegurarse de que STDIN se haya revertido y pueda usar el teclado normalmente.

Cerrar descriptores de archivo

Cuando finaliza el script, los descriptores de archivo se cerrarán automáticamente. Si desea cerrar el descriptor de archivo usted mismo, redirija el descriptor de archivo a este símbolo &- estará cerrado.

#!/bin/bash

exec 3> myfile

echo "Testing ..." >&3

exec 3>&-

echo "Nothing works" >&3

Como puede ver, da un error de 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 el ID del proceso.

-d:para el descriptor de archivo.

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

Podemos usar -a para combinar los resultados de la opción -p y la opción -d.

Ahora, probando el comando desde un script:

#!/bin/bash

exec 4> myfile1

exec 5> myfile2

exec 6< myfile3

lsof -a -p $$ -d 0,1,2,4,5,6

El script de shell crea los descriptores de archivo 4 y 5 para escritura y 6 para lectura.

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

Puede truncar un archivo sin eliminarlo por completo usando el mismo comando.

cat /dev/null > myfile

Ahora comprende la entrada, la salida, cómo redirigirlos, cómo crear su descriptor de archivo y redirigirlo.

Espero que lo disfruten. Sigue regresando.

Gracias.


Linux
  1. Cómo redirigir la salida a un archivo y salida estándar en Linux

  2. ¿Descriptores de archivos y secuencias de comandos de Shell?

  3. ¿Redirigir y canalizar la salida?

  4. ¿Cómo obtener la entrada y la salida en una terminal a un archivo de texto?

  5. Cómo redirigir la salida a un archivo y stdout

Cómo redirigir la salida del comando de shell

Explicación de la redirección de entrada y salida en Linux

Explicado:entrada, salida y redirección de errores en Linux

Bash Scripting:cómo generar y formatear texto en Linux Shell

Usando rz y sz bajo Linux Shell

Linux:¿Cómo usar un archivo como entrada y salida al mismo tiempo?