Acrescentar um arquivo, saída para tela e redirecionar de stderr de uma só vez, sem tee

1

Estou executando um comando time dd em um script de shell e gostaria de exibir os resultados em 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 exiba a tela. O que eu precisaria fazer para fazer as três coisas?

Observe que estou executando isso em um sistema embarcado com uma instalação do Busybox que não inclui tee , portanto, isso não é uma duplicata de esta questão .

    
por Yann 15.10.2014 / 12:52

2 respostas

3

O que você está mostrando funciona conforme o esperado no meu sistema. Tem certeza de que está usando bash e não sh ? De qualquer forma, eu tentei com dash e com busybox sh e também funcionou lá. Na ausência de tee , acho que a única solução será cat $logfile após o comando ser concluído.

Outra possibilidade seria criar um link para busybox chamado tee e tentar executá-lo. O busybox que veio com o meu Debian suporta isso, mas eu não sei se o seu irá:

ln -s /bin/busybox /bin/tee

Em seguida, tente executar tee normalmente.

Se você realmente não pode obter 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
    
por 15.10.2014 / 13:13
-2

Você pode usar o comando tee . Aqui eu agrupei os comandos time e dd usando o bloco de código para que eles sejam tratados como um único comando e sua saída possa ser manipulada 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 blocos de código funcionarem.

Incase se você não quiser usar tee , então 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
    
por 15.10.2014 / 13:16