¿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.
¿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.
Respuestas:
Puede combinar dos comandos agrupándolos con { }
:
{ command1 & command2; }
hasta ahora, puede redirigir el grupo a un archivo (el último ;
antes }
es obligatorio):
{ command1 & command2; } > new_file
si quieres separar STDOUT
y STDERR
en dos archivos:
{ command1 & command2; } > STDOUT_file 2> STDERR_file
;
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.
( )
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.
alias app () {
nohup python ~/projects/trunk/run.py run 1>/tmp/log 2>&1 &
echo $! > /tmp/api.pid
nohup node ~/projects/trunk/index.js 1>/tmp/log 2>&1 &
echo $! > /tmp/client.pid
tail -f /tmp/log
}
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:
paste $(node ~/projects/trunk/index.js) $(python ~/projects/trunk/run.py run) > outputfile
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:
cmd1() {
perl -e 'while(1) { print "a"x3000_000,"\n"}'
}
export -f cmd1
cmd2() {
perl -e 'while(1) { print "b"x3000_000,"\n"}'
}
export -f cmd2
Al ejecutarlos en paralelo, desea que la salida tenga líneas completas de a
s seguidas de líneas completas de b
s. Lo que no desea es que a
sys se b
mezclen en la misma línea ( tr -s ab
reemplaza la repetición de a
s con una sola a
, por lo que es más fácil ver qué sucede):
# This is bad - half lines are mixed
$ (cmd1 & cmd2 ) | tr -s ab
bababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababa
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
Si en su lugar usa GNU Parallel, obtendrá líneas completas limpias con a
s o b
s pero nunca mezcladas:
$ parallel --line-buffer ::: cmd1 cmd2 | tr -s ab
a
a
b
b
b
b
a
Las versiones más nuevas de GNU Parallel incluso evitan llenar su disco: lo anterior puede ejecutarse para siempre.
Como ya está usando node
, es posible que desee probar simultáneamente
Ejecute múltiples comandos al mismo tiempo. Como
npm run watch-js & npm run watch-less
pero mejor.
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.
(echo 'ab' && echo 'cd' && echo 'ef') | tr -d '\n'
>>> abcdef
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)
# hex prefix encode a message as hex hex suffix | strip newline | hex to binary | (then, for example, send the binary over a TCP connection)
(echo '1b40' && echo "Test print #1" | xxd -p && echo '1d564103') | tr -d '\n' | xxd -r -p | nc -N 192.168.192.168 9100
(Nota: este método solo funciona si los comandos salen. Para combinar stdout de comandos que no salen, vea otras respuestas).