É possível combinar a saída desses dois comandos?
node ~/projects/trunk/index.js
python ~/projects/trunk/run.py run
Nenhum comando sai, então não tenho certeza de como fazer isso.
É possível combinar a saída desses dois comandos?
node ~/projects/trunk/index.js
python ~/projects/trunk/run.py run
Nenhum comando sai, então não tenho certeza de como fazer isso.
Respostas:
Você pode combinar dois comandos agrupando-o com { }
:
{ command1 & command2; }
até o momento, você pode redirecionar o grupo para um arquivo (a última ;
antes }
é obrigatória):
{ command1 & command2; } > new_file
se você deseja separar STDOUT
e STDERR
em dois arquivos:
{ command1 & command2; } > STDOUT_file 2> STDERR_file
;
antes }
, é obrigatório!
{ yes {1..20} & yes {1..20}; } | grep -v '^1 2 3'
qual, idealmente, não imprimirá nada se as linhas não estiverem quebradas.
&&
vez de &
! command1 & command2
- isso executa o comando1 em segundo plano e inicia o comando2 imediatamente, executando ambos os comandos em paralelo e atrapalhando a saída. command1 && command2
- isso executa o comando1 (em primeiro plano) e, em seguida, se o comando1 for bem-sucedido, executa o comando2.
De maneira mais geral, é possível usar um subshell ou um agrupamento de comandos e redirecionar a saída de todo o grupo de uma só vez.
Código:
( command1 ; command2 ; command3 ) | cat
{ command1 ; command2 ; command3 ; } > outfile.txt
A principal diferença entre os dois é que o primeiro divide um processo filho, enquanto o segundo opera no contexto do shell principal. Isso pode ter consequências em relação à configuração e uso de variáveis e outras configurações do ambiente, bem como ao desempenho.
Não esqueça que o colchete de fechamento no agrupamento de comandos (e funções) deve ser separado do conteúdo por ponto e vírgula ou por uma nova linha. Isso ocorre porque, "}"
na verdade, é um comando (palavra-chave) próprio e deve ser tratado como um.
( )
funciona bem também.
}
não é um comando. É uma palavra reservada. O mesmo vale para {
. Eu costumo escrever tais listas assim: { command1;command2;} > outfile.txt
. Você pode adicionar espaços após o ponto e vírgula, mas não é necessário. O espaço depois {
é necessário, no entanto.
( yes {1..20} & yes {1..20}; ) | grep -v '^1 2 3'
qual, idealmente, não imprimirá nada se as linhas não estiverem quebradas. (H / t para @antak).
( command1 && command2 && command3 ) | cat
()
como os parênteses, {}
que são executados como um progresso em segundo plano e, em seguida, você deve lidar com a saída disso. Também tubo para gato `| cat` é uma alternativa mais agradável do que `> / dev / stdout` #
Acabei fazendo isso, as outras sugestões não funcionaram, pois o 2º comando foi morto ou nunca executado.
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
embora nunca tenha visto isso como um problema, com 2 processos diferentes gravando no mesmo arquivo de log.
yes {1..20}
command1 = command2 = yes {1..20}
e canalizar a saída combinada através da | grep -v '^1 2 3'
qual idealmente não imprimirá nada se as linhas não estiverem quebradas. (H / t para @antak).
Tente o seguinte:
paste $(node ~/projects/trunk/index.js) $(python ~/projects/trunk/run.py run) > outputfile
Até agora, a maioria das soluções lida mal com o problema de linha parcial. Suponha por um segundo que os programas sejam:
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
Ao executar aqueles em paralelo, você deseja que a saída tenha linhas completas de a
s seguidas por linhas completas de b
s. O que você não quer é a
s e b
s de mistura na mesma linha ( tr -s ab
substitui repetindo a
s com um único a
, por isso é mais fácil de ver o que acontece):
# This is bad - half lines are mixed
$ (cmd1 & cmd2 ) | tr -s ab
bababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababa
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
Se você usar o GNU Parallel, obterá linhas completas limpas com a
s ou b
s, mas nunca misturadas:
$ parallel --line-buffer ::: cmd1 cmd2 | tr -s ab
a
a
b
b
b
b
a
As versões mais recentes do GNU Parallel evitam o preenchimento do seu disco: O acima pode ser executado para sempre.
Como você já está usando node
, convém tentar simultaneamente
Execute vários comandos simultaneamente. Como
npm run watch-js & npm run watch-less
mas melhor.
Para o caso especial de combinar várias saídas de comando BASH em uma linha, aqui está uma receita para executar cada comando sucessivamente, removendo novas linhas entre suas saídas.
(echo 'ab' && echo 'cd' && echo 'ef') | tr -d '\n'
>>> abcdef
Como um exemplo do mundo real, o código abaixo incorporará uma mensagem ASCII entre duas cadeias de bytes fixas (formando um comando de impressão, neste 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 funciona apenas se os comandos forem encerrados. Para combinar stdout de comandos que não saem, consulte outras respostas.)