É 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.
bash
io-redirection
chovy
fonte
fonte
Respostas:
Você pode combinar dois comandos agrupando-o com
{ }
:até o momento, você pode redirecionar o grupo para um arquivo (a última
;
antes}
é obrigatória):se você deseja separar
STDOUT
eSTDERR
em dois arquivos:fonte
;
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.fonte
( )
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.
fonte
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:
fonte
Até agora, a maioria das soluções lida mal com o problema de linha parcial. Suponha por um segundo que os programas sejam:
Ao executar aqueles em paralelo, você deseja que a saída tenha linhas completas de
a
s seguidas por linhas completas deb
s. O que você não quer éa
s eb
s de mistura na mesma linha (tr -s ab
substitui repetindoa
s com um únicoa
, por isso é mais fácil de ver o que acontece):Se você usar o GNU Parallel, obterá linhas completas limpas com
a
s oub
s, mas nunca misturadas:As versões mais recentes do GNU Parallel evitam o preenchimento do seu disco: O acima pode ser executado para sempre.
fonte
Como você já está usando
node
, convém tentar simultaneamentefonte
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.
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)
(Nota: este método funciona apenas se os comandos forem encerrados. Para combinar stdout de comandos que não saem, consulte outras respostas.)
fonte