En informática , la redirección es una forma de comunicación entre procesos y es una función común a la mayoría de los intérpretes de línea de comandos , incluidos los distintos shells de Unix que pueden redirigir flujos estándar a ubicaciones especificadas por el usuario.
En Unix-como sistemas operativos, programas hacen redirección con el dup2 (2) llamada al sistema , o su menos flexible pero más alto nivel stdio análogos, freopen (3) y popen (3) .
Redirigir la entrada estándar y la salida estándar
La redirección generalmente se implementa colocando ciertos caracteres entre los comandos .
Básico
Normalmente, la sintaxis de estos caracteres es la siguiente, que se usa <
para redirigir la entrada y >
redirigir la salida. command > file1
ejecuta command1 , colocando la salida en file1 , en lugar de mostrarlo en la terminal, que es el destino habitual para la salida estándar. Esto golpeará cualquier dato existente en archivo1 .
El uso de command < file1
ejecuta comando1 , con file1 como fuente de entrada, a diferencia del teclado , que es la fuente habitual de entrada estándar.
command < infile > outfile
combina las dos capacidades: command1 lee de infile y escribe a archivar
Variantes
Para añadir la salida al final del archivo, en lugar de clobbering ella, el >>
se utiliza el operador: command1 >> file1
.
Para leer desde un literal de flujo (un archivo en línea, pasado a la entrada estándar), uno puede usar un documento aquí , usando el <<
operador:
$ tr az AZ << END_TE XT > uno dos tres > uno dos tres > END_TEXT UNO DOS TRES UNO DOS TRES
Para leer de una cadena, uno puede usar una cadena aquí , usando el <<<
operador:, o:tr a-z A-Z <<< "one two three"
$ NUMBERS = "uno dos tres" $ tr az AZ <<< " $ NUMBERS " UNO DOS TRES
Tubería
Los programas se pueden ejecutar juntos de modo que un programa lea la salida de otro sin necesidad de un archivo intermedio explícito. ejecuta command1 | command2
command1 , utilizando su salida como entrada para command2 (comúnmente llamado piping , con el carácter " |
" conocido como "pipe").
Los dos programas que ejecutan los comandos pueden ejecutarse en paralelo y el único espacio de almacenamiento son los búferes de trabajo (Linux permite hasta 64K para cada búfer) más cualquier espacio de trabajo que requiera el procesamiento de cada comando. Por ejemplo, un comando de "clasificación" no puede producir ninguna salida hasta que se hayan leído todos los registros de entrada, ya que el último registro recibido podría resultar ser el primero en el orden ordenado. El sistema operativo experimental de la Dra. Alexia Massalin, Synthesis , ajustaba la prioridad de cada tarea a medida que se ejecutaban de acuerdo con la plenitud de sus búferes de entrada y salida.
Esto produce el mismo resultado final que usar dos redireccionamientos y un archivo temporal, como en:
$ command1> tempfile $ command2 $ rm tempfile
Pero aquí, command2 no comienza a ejecutarse hasta command1 ha finalizado y se requiere un archivo borrador suficientemente grande para contener los resultados intermedios, así como cualquier espacio de trabajo que requiera cada tarea. Como ejemplo, aunque DOS permite la sintaxis "pipe", emplea este segundo enfoque. Por lo tanto, suponga que algún programa de larga duración "Worker" produce varios mensajes a medida que funciona, y que un segundo programa, TimeStamp copia cada registro de stdin a stdout , precedido por la fecha y hora del sistema cuando se recibe el registro. Una secuencia como la que produciría marcas de tiempo solo cuando Worker hubiera terminado, simplemente mostrando cuán rápido se podía leer y escribir su archivo de salida.Worker | TimeStamp > LogFile.txt
Un buen ejemplo de canalización de comandos es la combinación echo
con otro comando para lograr algo interactivo en un shell no interactivo, por ejemplo . Esto ejecuta el cliente ftp con entrada echo -e 'user\npass' | ftp localhost
usuario , presione regresa , entonces pasar .
En el uso casual, el paso inicial de una canalización suele ser cat
o echo
leer desde un archivo o cadena. Esto a menudo puede ser reemplazado por una indirección de entrada o una cadena here , y el uso de cat y piping en lugar de la redirección de entrada se conoce como uso inútil de cat . Por ejemplo, los siguientes comandos:
$ cat infile | comando $ echo $ string | comando $ echo -e 'usuario \ npass' | ftp localhost
puede ser reemplazado por:
$ comando $ comando <<< $ cadena $ ftp localhost <<< $ 'usuario \ npass'
Como echo
suele ser un comando interno del shell, su uso no es tan criticado como cat, que es un comando externo.
Redirigir hacia y desde los identificadores de archivos estándar
En los shells de Unix derivados del shell de Bourne original , las dos primeras acciones pueden modificarse aún más colocando un número (el descriptor de archivo ) inmediatamente antes del carácter ; esto afectará a qué flujo se utiliza para la redirección. Los flujos de E / S estándar de Unix son:
Resolver | Nombre | Descripción |
---|---|---|
0 | stdin | Entrada estándar |
1 | stdout | Salida estándar |
2 | stderr | Error estándar |
Por ejemplo, ejecuta command 2> file1
comando , dirigiendo el flujo de error estándar a archivo1 .
En los shells derivados de csh (el shell de C ), la sintaxis en su lugar agrega el & (ampersand) a los caracteres de redireccionamiento, logrando así un resultado similar. La razón de esto es distinguir entre un archivo llamado '1' y la salida estándar, es decir vs . En el primer caso, stderr se redirige a un archivo llamado ' cat file 2>1
cat file 2>&1
1 'y en el segundo, stderr se redirige a stdout.
Otra capacidad útil es redirigir un identificador de archivo estándar a otro. La variación más popular es fusionar el error estándar en la salida estándar para que los mensajes de error se puedan procesar junto con (o alternativamente) la salida habitual. Por ejemplo, intentará encontrar todos los archivos con el nombre find / -name .profile > results 2>&1
.profile . Ejecutado sin redirección, generará visitas a stdout y errores (por ejemplo, por falta de privilegios para atravesar directorios protegidos) a stderr . Si la salida estándar se dirige al archivo resultados , aparecen mensajes de error en la consola. Para ver tanto los resultados como los mensajes de error en el archivo resultados , fusionar stderr (identificador 2) en stdout (identificador 1) usando 2>&1
.
Si la salida fusionada se va a canalizar a otro programa, la secuencia de combinación de archivos 2>&1
debe preceder al símbolo de canalización, por lo tanto,find / -name .profile 2>&1 | less
Una forma simplificada pero no conforme con POSIX del comando es (no disponible en Bourne Shell antes de la versión 4, versión final, o en el shell estándar Debian Almquist shell usado en Debian / Ubuntu): o .command > file 2>&1
command &>file
command >&file
Es posible utilizarlo 2>&1
antes de " >
", pero el resultado suele malinterpretarse. La regla es que cualquier redirección establece el identificador del flujo de salida de forma independiente. Entonces, " 2>&1
" establece el identificador 2
en lo que sea que el identificador 1
apunte, que en ese punto suele ser stdout . Luego " >
" redirecciona el identificador 1
a otra cosa, por ejemplo, un archivo, pero no cambia el identificador 2
, lo que aún apunta a stdout .
En el ejemplo siguiente, la salida estándar se escribe en el archivo , pero los errores se redirige desde stderr a stdout, es decir, enviados a la pantalla: .command 2>&1 > file
Para escribir tanto los errores como la salida estándar en el archivo , se debe invertir el orden. Salida estándar primera sería redirigido al archivo, a continuación, stderr, además, serán redireccionados al mango salida estándar que ya ha sido cambiado al punto en el archivo: .command > file 2>&1
Tuberías encadenadas
Los tokens de redirección y canalización se pueden encadenar para crear comandos complejos. Por ejemplo, ordena las líneas de sort infile | uniq -c | sort -n > outfile
archivar en orden lexicográfico, escribe líneas únicas prefijadas por el número de ocurrencias, ordena la salida resultante numéricamente y coloca la salida final en outfile . Este tipo de construcción se utiliza con mucha frecuencia en scripts de shell y archivos por lotes .
Redirigir a múltiples salidas
El comando estándar camiseta puede redirigir la salida de un comando a varios destinos:. Esto dirige la salida de la lista de archivos a la salida estándar y al archivo ls -lrt | tee xyz
xyz .
Ver también
- Here-document , una forma de especificar texto para la entrada en shells de línea de comandos
- Palear conchas
- Sustitución de mando
- Sustitución de procesos
enlaces externos
- : duplicar un descriptor de archivo abierto - Referencia de interfaces del sistema, Especificación única de UNIX , Edición 7 de The Open Group
- Definición de redireccionamiento por The Linux Information Project (LINFO)
- Redirección de E / S en el proyecto de documentación de Linux
- Redirección en Windows
- Creación de un proceso hijo con entrada y salida redirigidas en Windows