2012-08-11 12 views
37

¿Cómo puedo conectar el stdout de múltiples comandos a un solo comando?Pipetear varios comandos en un solo comando

Ejemplo 1: combinar y ordenar la salida de todos los tres comandos de eco:

echo zzz; echo aaa; echo kkk 

salida deseada:

aaa 
kkk 
zzz 

Ejemplo 2: reescribir la siguiente para que todos los comandos están en un solo línea de comando usando tuberías, sin redirecciones a un archivo temporal:

setopt > /tmp/foo; unsetopt >> /tmp/foo; set >> /tmp/foo; sort /tmp/foo 

Respuesta

66

Use paréntesis() para combine los comandos en un solo proceso, que concatenará el stdout de cada uno de ellos.

Ejemplo 1 (nota que $ es el intérprete de comandos):

$ (echo zzz; echo aaa; echo kkk) | sort 
aaa 
kkk 
zzz 


Ejemplo 2:

(setopt; unsetopt; set) | sort 
+12

+1. También puede usar llaves que no engendren una subcamada. La sintaxis es un poco más estricta: '{setopt; unsetopt; conjunto; } | ordenar | less': se requiere el espacio en blanco alrededor de las llaves y el punto y coma final. –

+6

@glenn: eso no importa (probado en bash 3.2.48), ya que la canalización lo fuerza a una subshell de todos modos. –

+1

Se debe tener en cuenta que '$' es la solicitud, no es parte del comando – Gilly

0

En Windows sería como sigue: (echo zzz & echo aaa & echo kkk) | sort

O si está dentro de un archivo por lotes; puede ser una línea mono (como una muestra) así como una línea múltiple:

(
echo zzz 
echo aaa 
echo kkk 
) | sort 

Nota: El post original no menciona es sólo para Linux, por lo que añadió la solución para la línea de comandos de Windows ... es muy útil cuando se trabaja con VHD/VHDX con diskpart dentro de las secuencias de comandos (echo diskpart_command) en lugar del eco en el mismo, pero deje que el echo, también hay otra manera sin ecos y con el redirector >, pero es muy propenso a errores y mucho más complejo de escribir (¿por qué usar una forma complicada propensa a errores si existe una forma simple que siempre funciona bien) ... también recuerde que %d% le da la ruta real (muy útil para no codificar la ruta de los archivos VHD/VHDX).

7

Puede utilizar {} para esto y eliminar la necesidad de un sub-shell como en (list), así:

{ echo zzz; echo aaa; echo kkk; } | sort 

necesitamos un espacio en blanco después de { y antes }. También necesitamos el último ; cuando la secuencia se escribe en una sola línea.

también podríamos escribirlo en varias líneas sin la necesidad de ningún ;:

Ejemplo 1:

{ 
    echo zzz 
    echo aaa 
    echo kkk 
} | sort 

Ejemplo 2:

{ 
    setopt 
    unsetopt 
    set 
} | sort 
Cuestiones relacionadas