stringtranslate.com

Redirección (informática)

Los flujos estándar para entrada, salida y error

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 diversos shells de Unix que pueden redirigir flujos estándar a ubicaciones especificadas por el usuario. El concepto de redirección es bastante antiguo y se remonta a los primeros sistemas operativos (OS). [ cita requerida ] Ya se puede encontrar una discusión de los objetivos de diseño para la redirección en la descripción de 1971 del subsistema de entrada-salida del sistema operativo Multics . [1] Sin embargo, antes de la introducción del sistema operativo UNIX con sus " tuberías ", la redirección en los sistemas operativos era difícil o incluso imposible de hacer. [2]

En los sistemas operativos tipo Unix , los programas realizan redirección con la llamada al sistema dup2 (2) , o sus análogos stdio menos flexibles pero de nivel superior , freopen (3) y popen(3) . [3]

Redirección de la entrada estándar y la salida estándar

La redirección generalmente se implementa colocando ciertos caracteres entre los comandos .

Básico

Por lo general, la sintaxis de estos caracteres es la siguiente: se utiliza <para redirigir la entrada y >para redirigir la salida. ejecuta command y coloca la salida en file1 en lugar de mostrarla en la terminal, que es el destino habitual de la salida estándar. Esto bloqueará cualquier dato existente en file1 .command > file1

El uso del comando ejecuta , con file1 como fuente de entrada, a diferencia del teclado , que es la fuente habitual para la entrada estándar.command < file1

command < infile > outfileCombina las dos capacidades: el comando lee desde el archivo de entrada y escribe en el archivo de salida.

Variantes

Para agregar la salida al final del archivo, en lugar de saturarlo, >>se utiliza el operador: .command1 >> file1

Para leer desde un literal de flujo (un archivo en línea, pasado a la entrada estándar), se puede usar un documento aquí , usando el <<operador:

$ tr  a-z  A-Z << END_TE XT > uno dos tres > uno dos tres > END_TEXT UNO DOS TRES UNO DOS TRES 

Para leer una cadena, se puede utilizar una cadena aquí , utilizando el <<<operador: , o:tr a-z A-Z <<< "one two three"

$ NÚMEROS = "uno dos tres" $ tr  a-z  A-Z <<< " $ NÚMEROS " UNO DOS TRES  

Tubería

Una tubería de tres programas que se ejecutan en una terminal de texto

Los programas se pueden ejecutar juntos de manera que un programa lea la salida de otro sin necesidad de un archivo intermedio explícito. ejecuta command1 , usando su salida como entrada para command2 (comúnmente llamado piping , donde el carácter " " se conoce como "pipe").command1 | command2|

Los dos programas que ejecutan los comandos pueden ejecutarse en paralelo y el único espacio de almacenamiento son los buffers de trabajo (Linux permite hasta 64K para cada buffer) más el espacio de trabajo que requiera el procesamiento de cada comando. Por ejemplo, un comando "sort" 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 de clasificación. El sistema operativo experimental de la Dra. Alexia Massalin, Synthesis , ajustaría la prioridad de cada tarea a medida que se ejecutaban de acuerdo con la plenitud de sus buffers de entrada y salida. [4]

Esto produce el mismo resultado final que usar dos redirecciones y un archivo temporal, como en:

$ comando1  >  archivo_templar $ comando2  <  archivo_templar $ rm  archivo_templar

Pero aquí, command2 no comienza a ejecutarse hasta que command1 ha terminado, y se requiere un archivo scratch lo 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, supongamos que un programa de larga ejecución "Worker" produce varios mensajes mientras trabaja, y que un segundo programa, TimeStamp, copia cada registro de stdin a stdout , prefijado por la fecha y hora del sistema cuando se recibe el registro. Una secuencia como esta produciría marcas de tiempo solo cuando Worker hubiera terminado, simplemente mostrando cuán rápidamente se podría leer y escribir su archivo de salida.Worker | TimeStamp > LogFile.txt

Un buen ejemplo de canalización de comandos es la combinación echocon otro comando para lograr algo interactivo en un shell no interactivo, por ejemplo , Esto ejecuta el cliente FTP con la entrada usuario , presiona Enter y luego pasa .echo -e 'user\npass' | ftp localhost

En el uso casual, el paso inicial de una canalización es a menudo cato echo, leer desde un archivo o cadena. Esto a menudo se puede reemplazar por indirección de entrada o una cadena aquí , y el uso de cat y canalización en lugar de 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 reemplazarse por:

$ comando  <  archivo_de_entrada $ comando <<< $ cadena $ ftp localhost <<< $'usuario\ncontraseña'     

Como echosuele ser un comando interno del shell, su uso no es tan criticado como el de cat, que es un comando externo.

Redireccionamiento hacia y desde los controladores de archivos estándar

En los shells de Unix derivados del shell Bourne original , las dos primeras acciones se pueden modificar aún más colocando un número (el descriptor de archivo ) inmediatamente antes del carácter ; esto afectará qué flujo se utiliza para la redirección. [5] Los flujos de E/S estándar de Unix son: [6]

Por ejemplo, ejecuta el comando y dirige el flujo de error estándar al archivo1 .command 2> file1

En los shells derivados de csh (el shell C ), la sintaxis añade el carácter & (ampersand) a los caracteres de redirección, consiguiendo así un resultado similar. La razón de esto es distinguir entre un archivo llamado '1' y stdout, es decir vs . En el primer caso, stderr se redirige a un archivo llamado ' 1 ' y en el segundo, stderr se redirige a stdout.cat file 2>1cat file 2>&1

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 con) la salida habitual. Por ejemplo, intentará encontrar todos los archivos llamados .profile . Si se ejecuta sin redirección, generará los resultados en stdout y los errores (por ejemplo, por falta de privilegios para atravesar directorios protegidos) en stderr . Si la salida estándar se dirige al archivo results , los mensajes de error aparecen en la consola. Para ver tanto los resultados como los mensajes de error en el archivo results , fusione stderr (identificador 2) en stdout (identificador 1) usando .find / -name .profile > results 2>&12>&1

Si la salida fusionada se va a enviar a otro programa, la secuencia de fusión de archivos 2>&1debe 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 anterior a la versión 4, lanzamiento final, o en el shell estándar Debian Almquist usado en Debian/Ubuntu): o .command > file 2>&1command &>filecommand >&file

Es posible utilizar 2>&1antes de " >" pero el resultado suele malinterpretarse. La regla es que cualquier redirección establece el identificador en el flujo de salida de forma independiente. Por lo tanto, " 2>&1" establece el identificador 2en cualquier 1punto al que apunte el identificador, que en ese punto suele ser stdout . Luego, " >" redirige el identificador 1a otra cosa, por ejemplo, un archivo, pero no cambia el identificador 2, que sigue apuntando a stdout .

En el siguiente ejemplo, la salida estándar se escribe en el archivo , pero los errores se redirigen de stderr a stdout, es decir, se envían 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. La salida estándar se redirigiría primero al archivo y, luego, stderr se redirigiría adicionalmente al controlador de stdout que ya se ha modificado para que apunte al 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 infile en orden lexicográfico, escribe líneas únicas prefijadas por el número de ocurrencias, ordena numéricamente la salida resultante y coloca la salida final en outfile . [7] Este tipo de construcción se usa muy comúnmente en scripts de shell y archivos por lotes .sort infile | uniq -c | sort -n > outfile

Redirigir a múltiples salidas

El comando estándar tee puede redirigir la salida de un comando a varios destinos: . Esto dirige la salida de la lista de archivos tanto a la salida estándar como al archivo xyz .ls -lrt | tee xyz

Véase también

Referencias

  1. ^ Fiesta y Organick 1972.
  2. ^ Kernighan y Morgan 1982, pág. 780, Redirección de entrada/salida.
  3. ^ Manual de referencia de la biblioteca C de GNU para la versión 2.38 gnu.org
  4. ^ "KHB: Síntesis: Una implementación eficiente de servicios fundamentales de sistemas operativos". lwn.net .
  5. ^ Nozaki, Roberto (21 de abril de 2022). "Cómo redirigir la salida de un comando de shell". www.redhat.com .
  6. ^ "Redirecciones (Manual de referencia de Bash)". www.gnu.org .
  7. ^ "Conducción y redirección de salida en la terminal de Linux". Linux.org .

Fuentes

Enlaces externos