¿Es posible combinar la salida de estos dos comandos?
node ~/projects/trunk/index.js
python ~/projects/trunk/run.py run
Ninguno de los comandos sale, así que no estoy seguro de cómo hacer esto.
bash
io-redirection
chovy
fuente
fuente
Respuestas:
Puede combinar dos comandos agrupándolos con
{ }
:hasta ahora, puede redirigir el grupo a un archivo (el último
;
antes}
es obligatorio):si quieres separar
STDOUT
ySTDERR
en dos archivos:fuente
;
antes}
, ¡es obligatorio!{ yes {1..20} & yes {1..20}; } | grep -v '^1 2 3'
que idealmente no imprimirá nada si las líneas no se rompen.&&
lugar de&
!command1 & command2
- esto ejecuta el comando1 en segundo plano y el comando2 inmediatamente, ejecutando ambos comandos en paralelo y desordenando la salida.command1 && command2
- esto ejecuta command1 (en primer plano) y luego, si command1 se ejecuta correctamente, ejecuta command2.En términos más generales, es posible usar una agrupación de comandos o una subshell y redirigir la salida de todo el grupo a la vez.
Código:
( command1 ; command2 ; command3 ) | cat
{ command1 ; command2 ; command3 ; } > outfile.txt
La principal diferencia entre los dos es que el primero se divide en un proceso secundario, mientras que el segundo opera en el contexto del shell principal. Esto puede tener consecuencias con respecto a la configuración y el uso de variables y otras configuraciones de entorno, así como el rendimiento.
No olvide que el corchete de cierre en la agrupación de comandos (y funciones) debe estar separado del contenido por un punto y coma o una nueva línea. Esto se debe a
"}"
que en realidad es un comando (palabra clave) propio y debe tratarse como tal.fuente
( )
trabajos bien también.}
No es un comando en absoluto. Es una palabra reservada. Lo mismo vale para{
. Por lo general escribo estas listas, así:{ command1;command2;} > outfile.txt
. Puede agregar espacios después del punto y coma, pero no es necesario. Sin embargo, el espacio posterior{
es necesario.( yes {1..20} & yes {1..20}; ) | grep -v '^1 2 3'
que idealmente no imprimirá nada si las líneas no se rompen. (H / t a @antak).( command1 && command2 && command3 ) | cat
()
como con los corchetes que{}
se ejecuta como un progreso de fondo y luego tienes que lidiar con la salida de eso. También pipa al gato `| cat` es una mejor alternativa que `> / dev / stdout`Terminé haciendo esto, las otras sugerencias no funcionaron, ya que el segundo comando fue asesinado o nunca ejecutado.
fuente
tail -f *.log
aunque nunca he visto esto como un problema con 2 procesos diferentes que escriben en el mismo archivo de registro.yes {1..20}
command2 =yes {1..20}
y canalizar la salida combinada a través de la| grep -v '^1 2 3'
cual idealmente no se imprimirá nada si las líneas no se rompen. (H / t a @antak).Prueba esto:
fuente
La mayoría de las soluciones hasta ahora tratan mal el problema de la línea parcial. Suponga por un segundo que los programas son:
Al ejecutarlos en paralelo, desea que la salida tenga líneas completas de
a
s seguidas de líneas completas deb
s. Lo que no desea es quea
sys seb
mezclen en la misma línea (tr -s ab
reemplaza la repetición dea
s con una solaa
, por lo que es más fácil ver qué sucede):Si en su lugar usa GNU Parallel, obtendrá líneas completas limpias con
a
s ob
s pero nunca mezcladas:Las versiones más nuevas de GNU Parallel incluso evitan llenar su disco: lo anterior puede ejecutarse para siempre.
fuente
Como ya está usando
node
, es posible que desee probar simultáneamentefuente
Para el caso especial de combinar múltiples salidas de comandos BASH en una línea, aquí hay una receta para ejecutar cada comando a su vez, eliminando cualquier nueva línea entre sus salidas.
Como ejemplo del mundo real, el siguiente código incrustará un mensaje ASCII entre dos cadenas fijas de bytes (formando un comando de impresión, en este caso)
(Nota: este método solo funciona si los comandos salen. Para combinar stdout de comandos que no salen, vea otras respuestas).
fuente