2012-03-04 30 views
20

¿Cuál es la diferencia exacta entre Tubería y Redirección?Tubería y redirección

¿Dónde deberíamos usar tuberías y dónde deberíamos usar la redirección?

¿Cómo funcionan internamente?

Respuesta

22

La redirección es (principalmente) para archivos (redirige las secuencias a/desde archivos).

La tubería es para procesos: canaliza (redirige) flujos de un proceso a otro.

Esencialmente lo que realmente se hace es "conectar" una corriente estándar (generalmente stdout) de un proceso a la transmisión estándar de otro proceso (generalmente stdin) a través de una tubería.

tuberías tienen también la sincronización "efecto secundario": bloquean un proceso (de lectura) cuando el otro no tiene nada que escribir (aún) o cuando el proceso de lectura no puede leer suficientemente rápido (cuando el búfer de la tubería es completo).

1

redirección: enviar la salida (stdout y/o stderr) de un comando a un archivo Ejemplo: ls > your_file escribir el resultado del listado de directorio en un archivo denominado your_file

Tubería: enviar la salida a otro comando. Ejemplo ls | wc envía la misma salida (listado de directorios) al comando wc que cuenta los caracteres.

6

La tubería dirige la salida de un programa a otro programa.

Por ejemplo:

ls * | grep "name" 

Tubos Los nombres de todos los archivos en el directorio actual a grep. La reorientación dirige o agrega salida a un archivo.

ls * > file # writes all file names in current directory to the "file" 
ls * >> file # appends all files names in current directory to the "file" 

Tubería le ahorra la molestia de tener que escribir en un archivo, a continuación, leer de un archivo para ejecutar un programa en la salida de otro programa.

ls * > file 
grep "name" file 

es equivalente a

ls * | grep "name" 

En cuanto a la forma en que trabajan internamente, sólo estoy aprendiendo que mi auto ahora. Pero encontré este enlace que ofrece alguna discusión al respecto.

How Does Piping Work in Linux?

Debe utilizar tuberías si desea pasar salidas entre los programas; use la redirección si quiere escribir en un archivo.

0

Básicamente, la redirección y las tuberías son algunas de las formas para lograr la comunicación entre procesos en Unix.

  1. redirección: Los datos se escriben y se leen desde un archivo típico de UNIX. Cualquier cantidad de procesos puede interoperar. esto se debe usar cuando se comparten grandes conjuntos de datos.

ls > FileName

  1. Piping: Tubería es un proceso donde la salida de un proceso se hace la entrada de otro. Se desarrollaron en las formas más primitivas del sistema operativo Unix. Proporcionan un flujo de comunicación unidireccional entre procesos dentro del mismo sistema. Se crea una tubería invocando la llamada al sistema de tuberías, que crea un par de descriptores de archivos. [Para leer los descriptores de archivos http://www.bottomupcs.com/file_descriptors.html]

ls | grep $myName

Funciona en la simple intercambio de datos, tales como el productor y el consumidor.

Comparación de propiedades: La tubería es siempre unidireccional, mientras que la redirección se puede utilizar para redirigir la entrada y la salida.

ls > grep myFileName [redirigir la salida del primer comando a uno más adelante] sort < fileName.txt [archivo de redireccionamiento filename.txt como entrada al comando sort]

Uno también puede escribir a continuación para utilizar redirección bidireccional en una sola declaración.

sort <fileName.txt> sortNewFile.txt

Mientras Piping, siempre es la salida del primer comando suministrado a la posterior y que a simulanoeously.

ls | grep myName | awk '{ print $NF }' [tuberías múltiples en una sola instrucción]

Nota 1:command > fileName. Si hay un comando llamado fileName, eso haría que usar la redirección sea mucho más difícil y más propenso a errores. Primero se debe verificar si hay un comando llamado como archivo de destino.

Otras maneras de lograr IPC en el sistema Unix son:

  1. tubería con nombre
  2. señal
  3. Memoria compartida
  4. zócalo
+0

Gracias! Explicado muy bien. – edge

1

me he dado cuenta de que la canalización se aplica a la salida de la sustitución de proceso, pero no redirección:

bash-3.2$ echo $'one\ntwo\nthree' | tee >(grep o) | cat > pipe 
bash-3.2$ echo $'one\ntwo\nthree' | tee >(grep o) > redirect 
bash-3.2$ one 
two 

bash-3.2$ cat pipe 
one 
two 
three 
one 
two 
bash-3.2$ cat redirect 
one 
two 
three