Estou escrevendo um script bash e gostaria que o último comando iniciasse como um processo separado. O último comando também envia toda a saída para um arquivo. No entanto, também quero que a saída ainda apareça no console. O que eu tenho até agora é,
$ command > "file" &
Isso envia a saída para “arquivo” e também inicia o comando como seu próprio processo. No entanto, também quero ver a saída no console ao mesmo tempo (mas se eu pressionar ctrl+c ou w/e, o comando não para). Isso é muito parecidoessa questão, mas com a ressalva de que precisa ser um thread próprio.
Eu tentei:
$ command | tee "file" &
mas o problema é que tee faz parte do processo e a saída na verdade não aparece.
Então, só para esclarecer, quero ter command
um processo próprio, enviando a saída para um arquivo, mas ainda fazer com que a saída apareça no console (até eu apertar q, enter, ctrl+c ou algo assim). Como se trata de um script bash, duas linhas separadas seriam aceitáveis.
Responder1
Parece que você deseja command
terminar de gravar no arquivo, mas deseja interromper a exibição no console. Eu adotaria uma abordagem diferente para a solução. No seu roteiro:
> "file"
command > "file" &
tail -n +1 -F "file"
Correção:
A resposta original usada -n 0
, que inicialmente não gera nenhuma linha, "file"
mas gera todas as linhas adicionadas "file"
após tail
o início. Esta não foi minha intenção – foi um erro. Eu pretendia usar uma opção que listasse todas as linhas "file"
mesmo que command
tivesse escrito algumas antes de tail
ser iniciado. A opção correta para esse comportamento é -n +1
.
Na tail(1)
página de manual:
-n, --lines=K exibe as últimas K linhas, em vez das últimas 10; ou use -n +K para gerar linhas começando com K-ésimo
A primeira linha limpa o conteúdo do arquivo no caso de uma condição de corrida em que tail
o arquivo é atingido antes command
.