Anexe um arquivo, envie para a tela e redirecione do stderr de uma só vez, sem tee

Anexe um arquivo, envie para a tela e redirecione do stderr de uma só vez, sem tee

Estou executando um time ddcomando em um script de shell e gostaria de enviar os resultados para um arquivo e imprimi-lo na tela. A linha que estou executando atualmente é:

(time dd of=$dest_filepath if=$src_filepath bs=$block_size count=$block_count) >> $log_file 2>&1 &

Embora isso esteja me deixando com um arquivo vazio e não seja exibido na tela. O que eu precisaria fazer para fazer todas as três coisas?

Observe que estou executando isso em um sistema embarcado com uma instalação do Busybox queNão incluiteeentão isso não é uma duplicata deessa questão.

Responder1

O que você está mostrando funciona conforme o esperado no meu sistema. Tem certeza de que está usando bashe não sh? De qualquer forma, tentei with dashe with busyboxe shfuncionou lá também. Na ausência de tee, acho que a única solução será cat $logfileapós a conclusão do comando.

Outra possibilidade seria criar um link para busyboxo chamado teee tentar executá-lo. O busyboxque veio com meu Debian suporta isso, mas não sei se o seu:

ln -s /bin/busybox /bin/tee

Em seguida, tente executar teenormalmente.

Se você realmente não consegue tee, sua única outra opção seria algo assim:

foo=$( ( time dd if="file1" of="file2" bs=12 count=5 ) 2>&1 &)
echo "$foo"
echo "$foo" >> logfile

Responder2

Você pode usar o teecomando. Aqui agrupei os comandos timee ddusei o bloco de código para que eles sejam tratados como um único comando e sua saída possa ser tratada facilmente.

{ time dd of=$dest_filepath if=$src_filepath bs=$block_size count=$block_count; } 2>&1|tee $log_file

Anote o ;no final do segundo comando. Isso é obrigatório para que os blocos de código funcionem.

Caso você não queira usar tee, você pode pensar sobre isso

{ time dd of=$dest_filepath if=$src_filepath bs=$block_size count=$block_count; } 2>&1 &> $log_file;cat $log_file

informação relacionada