sistema comandos cluster archivos unix shell redirect pipe

unix - comandos - sistema de archivos linux



pegar sin archivos temporales en Unix (4)

Funciona en todas las conchas.

{ progA progB } | paste

Intento usar el comando pegar de Unix, que es como una forma de gato que se agrega a una columna, y encontré un rompecabezas que nunca supe cómo resolver en Unix.

¿Cómo se pueden usar las salidas de dos programas diferentes como entrada para otro programa (sin usar archivos temporales)?

Idealmente, haría esto (sin usar archivos temporales):

./progA> tmpA; ./progB> tmpB; pegar tmpA tmpB

Esto parece surgir con relativa frecuencia para mí, pero no puedo descifrar cómo usar la salida de dos programas diferentes ( progA y progB ) como entrada a otra sin usar archivos temporales ( tmpA y tmpB ).

Para comandos como pegar, simplemente usar paste $ (./ progA) $ (./ progB) (en notación bash) no servirá, ya que puede leer archivos o stdin.

La razón por la que desconfío de los archivos temporales es que no quiero tener trabajos ejecutándose en paralelo para causar problemas al usar el mismo archivo; garantizar un nombre de archivo único a veces es difícil.

Actualmente estoy usando bash, pero sería curioso ver soluciones para cualquier shell de Unix.

Y lo más importante, ¿me estoy acercando al problema de la manera correcta?


¡Aclamaciones!


Holy Moly, recientemente descubrí que, en algunos casos, puedes hacer que la sustitución de tu proceso funcione si configuras lo siguiente dentro de un script bash (si es necesario):

establecer + o posix

http://www.linuxjournal.com/content/shell-process-redirection

Desde el enlace: "La sustitución de procesos no es una función compatible con POSIX y, por lo tanto, debe estar habilitada a través de: establecer + o posix" Estuve atascado durante muchas horas, hasta que lo hice. Aquí está la esperanza de que este bocado adicional ayudará.


No necesita archivos temporales bajo bash, intente esto:

paste <(./progA) <(./progB)

Consulte "Sustitución de procesos" en el manual de Bash.


Use conductos con nombre (FIFO) como este:

mkfifo fA mkfifo fB progA > fA & progB > fB & paste fA fB rm fA fB

La sustitución del proceso de Bash hace algo similar de forma transparente, así que úsela solo si tiene un shell diferente.