Unix / Linux - Redirecciones de entrada / salida de Shell
En este capítulo, discutiremos en detalle sobre las redirecciones de entrada / salida de Shell. La mayoría de los comandos del sistema Unix toman la entrada de su terminal y envían la salida resultante a su terminal. Un comando normalmente lee su entrada desde la entrada estándar, que resulta ser su terminal por defecto. De manera similar, un comando normalmente escribe su salida en la salida estándar, que nuevamente es su terminal por defecto.
Redirección de salida
En su lugar, la salida de un comando normalmente destinado a la salida estándar se puede desviar fácilmente a un archivo. Esta capacidad se conoce como redirección de salida.
Si el archivo de notación> se agrega a cualquier comando que normalmente escribe su salida en la salida estándar, la salida de ese comando se escribirá en el archivo en lugar de en su terminal.
Compruebe lo siguiente who comando que redirige la salida completa del comando en el archivo de usuarios.
$ who > users
Observe que no aparece ninguna salida en el terminal. Esto se debe a que la salida se ha redirigido desde el dispositivo de salida estándar predeterminado (el terminal) al archivo especificado. Puede consultar el archivo de usuarios para ver el contenido completo:
$ cat users
oko tty01 Sep 12 07:30
ai tty15 Sep 12 13:32
ruth tty21 Sep 12 10:10
pat tty24 Sep 12 13:07
steve tty25 Sep 12 13:03
$
Si un comando tiene su salida redirigida a un archivo y el archivo ya contiene algunos datos, esos datos se perderán. Considere el siguiente ejemplo:
$ echo line 1 > users
$ cat users
line 1
$
Puede usar el operador >> para agregar la salida en un archivo existente de la siguiente manera:
$ echo line 2 >> users
$ cat users
line 1
line 2
$
Redirección de entrada
Así como la salida de un comando se puede redirigir a un archivo, la entrada de un comando también se puede redirigir desde un archivo. Como elgreater-than character > se utiliza para la redirección de salida, el less-than character < se utiliza para redirigir la entrada de un comando.
Los comandos que normalmente toman su entrada de la entrada estándar pueden tener su entrada redirigida desde un archivo de esta manera. Por ejemplo, para contar el número de líneas en el archivo que los usuarios generaron anteriormente, puede ejecutar el comando de la siguiente manera:
$ wc -l users
2 users
$
Tras la ejecución, recibirá el siguiente resultado. Puede contar el número de líneas en el archivo redirigiendo la entrada estándar delwccomando de los usuarios del archivo -
$ wc -l < users
2
$
Tenga en cuenta que existe una diferencia en la salida producida por las dos formas del comando wc. En el primer caso, el nombre de los usuarios del archivo se enumera con el recuento de líneas; en el segundo caso, no lo es.
En el primer caso, wc sabe que está leyendo su entrada de los usuarios del archivo. En el segundo caso, solo sabe que está leyendo su entrada desde la entrada estándar, por lo que no muestra el nombre del archivo.
Aquí Documento
UN here document se utiliza para redirigir la entrada a un programa o script de shell interactivo.
Podemos ejecutar un programa interactivo dentro de un script de shell sin la acción del usuario proporcionando la entrada requerida para el programa interactivo o script de shell interactivo.
La forma general de un here el documento es -
command << delimiter
document
delimiter
Aquí la cáscara interpreta el <<operador como una instrucción para leer la entrada hasta que encuentre una línea que contenga el delimitador especificado. Todas las líneas de entrada hasta la línea que contiene el delimitador se introducen en la entrada estándar del comando.
El delimitador le dice al shell que el hereel documento se ha completado. Sin él, el shell continúa leyendo la entrada para siempre. El delimitador debe ser una sola palabra que no contenga espacios ni tabulaciones.
A continuación se muestra la entrada al comando wc -l para contar el número total de líneas -
$wc -l << EOF
This is a simple lookup program
for good (and bad) restaurants
in Cape Town.
EOF
3
$
Puedes usar el here document para imprimir varias líneas usando su secuencia de comandos de la siguiente manera:
#!/bin/sh
cat << EOF
This is a simple lookup program
for good (and bad) restaurants
in Cape Town.
EOF
Tras la ejecución, recibirá el siguiente resultado:
This is a simple lookup program
for good (and bad) restaurants
in Cape Town.
El siguiente script ejecuta una sesión con el vi editor de texto y guarda la entrada en el archivo test.txt.
#!/bin/sh
filename=test.txt
vi $filename <<EndOfCommands
i
This file was created automatically from
a shell script
^[
ZZ
EndOfCommands
Si ejecuta este script con vim actuando como vi, es probable que vea un resultado como el siguiente:
$ sh test.sh
Vim: Warning: Input is not from a terminal
$
Después de ejecutar el script, debería ver lo siguiente agregado al archivo test.txt -
$ cat test.txt
This file was created automatically from
a shell script
$
Descartar la salida
A veces, necesitará ejecutar un comando, pero no desea que la salida se muestre en la pantalla. En tales casos, puede descartar la salida redirigiéndola al archivo/dev/null -
$ command > /dev/null
Aquí comando es el nombre del comando que desea ejecutar. El archivo/dev/null es un archivo especial que descarta automáticamente todas sus entradas.
Para descartar tanto la salida de un comando como su salida de error, use la redirección estándar para redirigir STDERR a STDOUT -
$ command > /dev/null 2>&1
aquí 2 representa STDERR y 1 representa STDOUT. Puede mostrar un mensaje en STDERR redirigiendo STDOUT a STDERR de la siguiente manera:
$ echo message 1>&2
Comandos de redireccionamiento
A continuación se muestra una lista completa de comandos que puede usar para la redirección:
No Señor. | Comando y descripción |
---|---|
1 | pgm > file La salida de pgm se redirige al archivo |
2 | pgm < file El programa pgm lee su entrada del archivo |
3 | pgm >> file La salida de pgm se adjunta al archivo |
4 | n > file Salida de flujo con descriptor n redirigido al archivo |
5 | n >> file Salida de flujo con descriptor n adjunto al archivo |
6 | n >& m Fusiona la salida de la secuencia n con corriente m |
7 | n <& m Fusiona la entrada de la secuencia n con corriente m |
8 | << tag La entrada estándar viene desde aquí hasta la siguiente etiqueta al principio de la línea |
9 | | Toma la salida de un programa o proceso y la envía a otro |
Tenga en cuenta que el descriptor de archivo 0 es normalmente entrada estándar (STDIN), 1 es salida estándar (STDOUT), y 2 es la salida de error estándar (STDERR).