Redirección de E/S

La redirección de E/S  es la capacidad del shell de comandos de algunos sistemas operativos para redirigir flujos estándar a una ubicación definida por el usuario, como un archivo. Característica para sistemas operativos similares a Unix , pero implementada en diversos grados en sistemas operativos de otras familias.

Redirigir flujos de entrada y salida estándar

La redirección generalmente se realiza insertando el carácter especial > entre los comandos.
Por lo general, la sintaxis se ve así: comando1 > archivo1 : ejecuta comando1 , colocando la salida estándar en archivo1 ; comando1 < archivo1 ejecuta comando1 usando archivo1 como entrada (en lugar del teclado ).
Para cada solicitud de entrada, el programa lee una línea de texto del archivo. La construcción comando1 < archivo1 > archivo2 combina las dos opciones anteriores: ejecuta la entrada de comando1 desde el archivo1 y la salida al archivo2 .

Transportadores

Las canalizaciones  son la capacidad de varios programas para trabajar juntos, cuando la salida de un programa va directamente a la entrada de otro sin el uso de archivos temporales intermedios . Sintaxis: comando1 | command2 ejecuta command1 usando su salida como entrada cuando se ejecuta command2 , que es lo mismo que usar dos redireccionamientos y un archivo temporal:

comando1 > archivo temporal comando2 < archivo temporal rm TempFile

Un buen ejemplo de canalización de comandos es combinar echo con otro comando para obtener interactividad en entornos no interactivos, por ejemplo:

echo -e "Nombre de usuario\nContraseña" | servidor local ftp

Esto inicia un cliente ftp que se conecta al host local ( localhost ). A solicitud del programa, ingresa la primera línea Nombre de usuario , luego, en la siguiente solicitud de entrada, lee la línea Contraseña . Las líneas en el comando echo están separadas por \n .

Redirección desde descriptores de archivo estándar

En el shell Unix derivado del shell Bourne , los dos pasos anteriores se pueden mejorar agregando un número ( descriptor de archivo ) inmediatamente antes del carácter de redirección. Este número especifica qué transmisión se está utilizando para la redirección. Unix tiene los siguientes flujos de entrada/salida estándar:

descriptor Nombre Descripción
0 Entrada estándar entrada estándar
una salida estándar salida estándar
2 estándar Salida de error estándar

Por ejemplo: comando1 2> archivo1 ejecuta comando1 , enviando un error estándar a archivo1 .

En shells derivados de C Shell , la sintaxis para especificar el flujo al que se redirigirá es agregar un carácter & después del carácter de redirección.

A menudo, el flujo de error estándar se combina con el flujo de salida estándar para que los errores y la salida normal del programa se puedan procesar juntos. Por ejemplo:

buscar / -nombre .perfil > resultados.txt 2>&1

intentará encontrar todos los archivos llamados .profile . Si se ejecuta sin redireccionamientos, este comando enviará resultados de búsqueda a stdout y mensajes de error (como permisos insuficientes al intentar buscar directorios protegidos) a stderr . De forma predeterminada, estos roles los cumple la consola. Si la salida estándar se dirige a results.txt , los errores aún se enviarán a la consola. Para que tanto los errores como los resultados de la búsqueda se envíen a results.txt , el error estándar y los flujos de salida se combinaron usando 2>&1 .

Escribir 2>&1 antes de > no funcionará, porque cuando el intérprete lee 2>&1 , no sabe a dónde se redirige la salida estándar, por lo que los flujos de error y salida no se fusionarán.

Si el resultado combinado debe canalizarse a la entrada de otro programa, entonces la secuencia 2>&1 debe preceder al signo de canalización | . Por ejemplo:

buscar / -nombre .perfil 2>&1 | menos _

Una forma simplificada del comando: comando > archivo 2>&1 se ve así: comando &> archivo o comando >& archivo

Cadena transportadora

Los comandos de redirección y canalización se pueden encadenar para producir comandos más complejos, como:

ls | grep '.sh' | ordenar > shlist

obtiene una lista del contenido del directorio actual, que se filtra para dejar solo las líneas que contienen '.sh' , luego esta lista filtrada se ordena léxicamente y el resultado final se coloca en el archivo shlist . Estos tipos de construcciones se encuentran a menudo en scripts de shell.

Redirigir a múltiples salidas

El comando tee estándar puede redirigir la salida de un comando a varios lugares al mismo tiempo. Ejemplo:

ls-lrt | te archivo1

dirige la salida estándar del comando ls -lrt (lista de archivos) tanto a la consola como al archivo1 .

Redirigir con

En el shell de Bash , puede redirigir a un archivo adjunto al final. En este caso, la información almacenada en el archivo no se eliminará, pero toda la información nueva se agregará al final de este archivo. Sintaxis: comando1 >> archivo1

Documento incrustado

Algunos shells, e incluso lenguajes de aplicación de alto nivel ( PHP , Perl ), permiten la sintaxis de documentos en línea (consulte la sintaxis de Heredoc ) para dirigir la entrada desde el propio archivo del programa, por ejemplo, a la salida estándar:

gato<<'EOF' El texto arbitrario se coloca aquí, incluyendo - incluyendo caracteres especiales fin de semana

O a un archivo adjunto al final:

gato<<'EOF'>>archivo El texto arbitrario se coloca aquí, incluyendo - incluyendo caracteres especiales fin de semana

La firma final del final de un documento incrustado EOF (se puede usar un valor arbitrario, pero EOF se usa a menudo  , según el significado) debe comenzar al principio de la línea.

Enlaces