Por lo general, solo necesitamos pasar un argumento:
echo abc | cat
echo abc | cat some_file -
echo abc | cat - some_file
¿Hay alguna manera de pasar dos argumentos? Algo como
{echo abc , echo xyz} | cat
cat `echo abc` `echo xyz`
Podría almacenar ambos resultados en un archivo primero
echo abc > file1
echo xyz > file2
cat file1 file2
Pero luego podría sobrescribir accidentalmente un archivo, lo que no está bien. Esto va en un script no interactivo. Básicamente, necesito una forma de pasar los resultados de dos comandos arbitrarios cat
sin escribir en un archivo.
ACTUALIZACIÓN: Lo siento, el ejemplo enmascara el problema. Si bien { echo abc ; echo xyz ; } | cat
parece funcionar, la salida se debe a la echo
s, no a la cat
.
Un mejor ejemplo sería el { cut -f2 -d, file1; cut -f1 -d, file2; } | paste -d,
que no funciona como se esperaba.
Con
file1:
a,b
c,d
file2:
1,2
3,4
La salida esperada es:
b,1
d,3
RESUELTO:
Usar sustitución de proceso :cat <(command1) <(command2)
Alternativamente, haga tuberías con nombre usando mkfifo
:
mkfifo temp1
mkfifo temp2
command1 > temp1 &
command2 > temp2 &
cat temp1 temp2
Menos elegante y más detallado, pero funciona bien, siempre y cuando se asegure de que temp1 y temp2 no existan de antemano.
Respuestas:
Creo que desea 'Proceso de sustitución' http://tldp.org/LDP/abs/html/process-sub.html . También funciona en zsh, aunque tiene más opciones y la sintaxis puede ser diferente.
Crea un pseudo archivo (
/dev/fd/something
) para cada sustitución. Es bastante útil El comando solo puede leerse como una secuencia, lo que significa que no puede ir y venir con fseek. Necesita leerlo como una secuencia de bytes, como una tubería.Sus ejemplos funcionan como sustitución de procesos:
Piense en ello como una herramienta para usar un proceso y haga que pretenda ser un archivo sin ningún archivo temporal.
(de mi respuesta anterior )
fuente
La cosa de llaves realmente funcionó porque el operador de tubería conectará las salidas estándar de los comandos agrupados en la entrada estándar de la tercera.
Puede decir que la impresión no proviene del eco ejecutando cualquier comando que no utilice la entrada estándar, por ejemplo
{ echo 1; echo 2;} | echo 3
, imprimirá 3 en lugar de 1 \ n2 \ n3.Sin embargo, esto no es lo que deseaba porque los dos comandos en las llaves se escriben en la misma salida, que es similar a
cat
sus resultados. Para generar dos resultados diferentes para usar como los dos argumentos para comandos comopaste
, deberá usar un archivo temporal o una canalización con nombre.Puede usarlo
mktemp
para generar un archivo temporal único omkfifo
para crear un archivo de tubería FIFO.fuente
Me gusta xargs Como ejemplo, quiero encontrar el tamaño de todo el directorio de datos mysql en / usr / local
xargs
fuente