Redirección de entrada/salida en Linux

        La redirección en Linux es una función que puede cambiar los dispositivos de entrada y salida estándar al ejecutar comandos en Linux. El flujo básico de los comandos de Linux es recibir entradas y producir salidas, pero las técnicas de redirección se pueden usar para cambiar la fuente o el destino de la entrada estándar (stdin) o la salida estándar (stdout). Por ejemplo, puede guardar la salida de un comando en un archivo en lugar de mostrarlo en la pantalla, o puede usar el contenido de un archivo como entrada para un comando en lugar de escribirlo con el teclado.

Hay tres flujos de datos involucrados en la ejecución de comandos en Linux:

  • La entrada estándar (stdin) es la fuente de los datos de entrada. De manera predeterminada, stdin es cualquier texto ingresado desde el teclado. Su ID de transmisión es 0.
  • La salida estándar (stdout) es el resultado del comando. Por defecto, se muestra en la pantalla. Su ID de transmisión es 1.
  • El error estándar (stderr) es el mensaje de error (si lo hay) producido por el comando. De forma predeterminada, stderr también se muestra en la pantalla. Su ID de transmisión es 2.

        Estos flujos contienen datos almacenados en la memoria intermedia como texto sin formato. Estos flujos se pueden redirigir usando algunos símbolos o comandos especiales, por ejemplo:

  • Redirección de salida: utilice los símbolos ">" o ">>" para redirigir la salida estándar a un archivo. Si se usa el símbolo ">", el contenido del archivo original se sobrescribirá; si se usa el símbolo ">>", la nueva salida se agregará al final del archivo original.
  • Redirección de entrada: utilice los símbolos "<" o "<<" para redirigir la entrada estándar a un archivo. Si se usa el símbolo "<", el comando leerá la entrada del archivo especificado; si se usa el símbolo "<<", el comando leerá la entrada de varias líneas del terminal que termina con el delimitador especificado.
  • Redirección de error: use la notación "2>" o "2>>" para redirigir stderr a un archivo. Si se usa el símbolo "2>", el contenido del archivo original se sobrescribirá; si se usa el símbolo "2>>", el nuevo mensaje de error se agregará al final del archivo original.

¿Qué es un descriptor de archivo?

        Un descriptor de archivo es un número entero no negativo asociado con un archivo abierto en el sistema. Es importante tener en cuenta que un descriptor de archivo está vinculado a un proceso y es único por proceso. Al abrir un nuevo archivo, el núcleo devuelve el descriptor de archivo asociado con él. Hay tres descriptores de archivo estándar asociados con su terminal.

Cuando se inicia bash, abre tres descriptores de archivo (fd) de forma predeterminada

  • entrada estándar (fd 0)
  • salida estándar (fd 1)
  • estándar (fd 2)

        Estos tres descriptores de archivo apuntan a su terminal (por ejemplo, /dev/tty0), por lo que la entrada se lee desde su terminal y la salida y los errores se redirigen a su terminal. 

stdin   (fd0)  -----> /dev/tty0
stdout  (fd1)  -----> /dev/tty0
stderr  (fd2)  -----> /dev/tty0

        Así es como se ve la redirección predeterminada. Pero estos se pueden cambiar de acuerdo a nuestras necesidades. La mejor manera de entender cómo funcionan los redireccionamientos es visualizarlos.

¿Qué es la redirección?

La redirección es el proceso de manipular la ubicación predeterminada hacia donde apuntan los descriptores de archivo estándar (stdin, stdout, stderr).

Redirigir la salida del comando a un archivo:

Syntax:
<command> n> file_name
Examples:
$ ls -la > list_file.txt
$ ls -la 1> list_file.txt

 Los dos comandos anteriores en el ejemplo son exactamente iguales. Si no se especifica ningún número de descriptor de archivo con el símbolo de redirección (>), el valor predeterminado es el descriptor de archivo 1 (el descriptor de archivo estándar). Ver visualización de redirección a continuación

fd0  -----> /dev/tty0
fd1  -----> list_file.txt
fd2  -----> /dev/tty0

 

Redirigir stdout y stdout a un archivo:

Este es uno de los escenarios más utilizados en los que la secuencia del comando, la salida estándar y la salida estándar se redireccionan a un archivo.

 

$ command &> file
$ command >file 2&>1

Así es como cambia la tabla de descriptores de archivo al ejecutar el comando después de la línea anterior.

Original                         After the redirection
0 ------> /dev/tty0              0 ---------> /dev/tty
1 ------> /dev/tty0              1 ------|--> file
2 ------> /dev/tty0              2 ------| 

El orden de redirección es importante aquí. Si se intercambia el orden de redirección, solo la salida estándar termina siendo redirigida al archivo. Intente seguir el ejemplo anterior para visualizar

Ingrese el contenido del archivo a través de la entrada estándar del comando:

Redirigir el contenido de un archivo a la entrada estándar del comando. Este esquema generalmente se usa para comandos de lectura , donde un archivo se puede pasar como entrada para leer, en lugar de leerlo desde una terminal.

read -n 5  < input_file.txt
0 -----> input_file.txt
1 -----> /dev/tty0
2 -----> /dev/tty0

Redirigir stderr de todos los comandos ejecutados a un archivo en una sesión de terminal:

¡Este comando es útil si desea redirigir la salida de todos los comandos ejecutados en una sesión de shell a un archivo específico!

$ exec 2>file
$ test_command1
$ test_command2

 

¿Cómo abrir un nuevo descriptor de archivo para lectura y escritura?

        Dependiendo de sus números, puede crear un descriptor de archivo personalizado y apuntarlo al archivo, que se puede usar para leer y escribir el archivo. Este caso de uso describe el uso del comando bash integrado: exec. Este incorporado, si se especifica antes de la redirección, los hará efectivos hasta que cambie explícitamente la redirección o salga del shell o script.exec

Abra un archivo para leer con un descriptor de archivo personalizado:

# point a file descriptor to file
$ exec 7<file_name
# Reads a line from the file pointed by filedescriptor 7
$ read -u 7 line
# close fd after reading
$ exec 7>&-

 

Escriba en un archivo utilizando un descriptor de archivo personalizado:

Esto es similar a escribir algo en stdout, excepto que tendrá un paso adicional apuntando un descriptor de archivo al archivo para escribir.

$ exec 3<file_write
$ echo "Test message" > &3
$ echo 3>&-

 Para abrir un archivo para lectura y escritura, puede usar el siguiente comando exec

#Use file descriptor for both reading and writing - Filename: Test.txt
$ exec 3 <>Test.txt

Ejemplos de más frases ingeniosas de bash:

Descartar salida de comando:

Redirigir al archivo especial /dev/null evitará imprimir la salida del comando en stdout. /dev/null es uno de los muchos archivos virtuales que se utilizan en Linux para escribir la salida. Todo lo que se escribe en /dev/null se olvida y nunca se imprime

$ test_command < /dev/null

Introduce el comando desde la terminal:

Los archivos se pueden crear y agregar en un solo comando tomando la entrada del terminal. A continuación se muestra un ejemplo. La sintaxis de <<EOF a continuación se llama heredoc.

$ cat > 'temp.txt' <<EOF
Always in love with bash and 
all the things we could do with it.
EOF

Imprima la salida estándar a la terminal y al archivo:

Tee no es técnicamente parte de bash, pero se usa con bastante frecuencia. Copia el flujo de entrada a la salida estándar y cero o más archivos. Créame, esto es muy útil, especialmente al depurar.

command -----> tee -----> stdout
                |--------> file

¿Dónde se utilizan las tuberías?

Pipe es una función de redirección en Linux, que puede enviar la salida de un comando/programa/proceso a otro comando/programa/proceso como entrada, para realizar la cooperación entre los comandos. El símbolo de Pipe es "|", que se puede usar para conectar varios comandos para formar una canalización de comandos. Por ejemplo:

ls | grep "txt" | wc-l

La función de este conducto de comandos es enumerar primero todos los archivos en el directorio actual, luego filtrar los archivos que contienen "txt" y finalmente contar la cantidad de estos archivos. La salida de cada comando se convierte en la entrada del siguiente comando hasta que la salida del último comando se muestra en el terminal.

El caso de uso más común para la tubería es enviar la salida de un comando como la entrada de otro comando.

Syntax:
command1 | command2
Examples:
$ ls . > file.txt
$ wc -l file.txt
The above two commands are equivalent to this one-liner
$ ls . | wc -l

 Este one-liner se puede usar para enviar stdout y stderr de un comando a stdin de otro comando.

command1 2>&1 | command2

 Redirigir una sola línea de texto como entrada a otro comando

echo “Test text” | test_command

 "Texto de prueba" ahora ingrese test_command.

Este artículo describe las funciones de redirección y tubería en Linux, y cómo usarlas para lograr la cooperación entre los comandos y el control del flujo de datos. A través de algunos ejemplos simples, mostramos cómo usar el comando de prueba para probar la validez de los comandos o expresiones, y cómo verificar el tipo y los permisos de los archivos. También cubrí algunos operadores de canalización y redirección de uso común, junto con su significado y uso. Espero que este artículo pueda ayudarlo a comprender y usar mejor las funciones de redirección y canalización en Linux, mejorar sus habilidades y eficiencia en la línea de comandos.

Gracias por leer este artículo, si encuentra este artículo útil para usted, por favor déme un me gusta o deje un comentario. Si tiene alguna pregunta o sugerencia, también puede ponerse en contacto conmigo. Haré todo lo posible para responder a sus preguntas y seguir mejorando el contenido de mi blog. ¡Gracias nuevamente por su apoyo y atención, y le deseo un feliz estudio!

Supongo que te gusta

Origin blog.csdn.net/qq_61813593/article/details/131609494
Recomendado
Clasificación