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.
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 .
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 TempFileUn 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 ftpEsto 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 .
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>&1intentará 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
Los comandos de redirección y canalización se pueden encadenar para producir comandos más complejos, como:
ls | grep '.sh' | ordenar > shlistobtiene 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.
El comando tee estándar puede redirigir la salida de un comando a varios lugares al mismo tiempo. Ejemplo:
ls-lrt | te archivo1dirige la salida estándar del comando ls -lrt (lista de archivos) tanto a la consola como al archivo1 .
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
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 semanaO a un archivo adjunto al final:
gato<<'EOF'>>archivo El texto arbitrario se coloca aquí, incluyendo - incluyendo caracteres especiales fin de semanaLa 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.