Como usar uma variável em vez de um arquivo para gerar este comando wc

6

Eu quero ler um arquivo de um determinado deslocamento até o final desse arquivo.

Eu preciso recuperar o número de bytes que foram lidos durante o processo e também redirecionar a saída do arquivo para outro lugar.

Aqui está o meu script:

...some stuff here...
dd if=$file bs=1 skip=$skippedBytes | tee >(wc --bytes > $file.count) >(cat - >> $file.output) | $($exportCommandString $file)
byteCount=$(cat $file.count)
rm $file.count
echo "Number of read bytes: $byteCount"

Eu gostaria que a parte "wc --bytes" colocasse seu valor retornado dentro de uma variável para que eu pudesse usá-la depois, sem usar um arquivo ($ file.count).

Algo como:

dd if=$file bs=1 skip=$skippedBytes | tee >(byteCount=$(wc --bytes)) >(cat - >> $file.output) | $($exportCommandString $file)
echo "Number of read bytes: $byteCount"

Só que, fazendo isso, meu script trava e não funciona.

É possível fazer isso e como?

    
por lauhub 09.03.2013 / 19:36

2 respostas

4

Você pode usar um pequeno hack com redirecionamentos:

byteCount=$( exec 3>&1 ; 
     dd if=$file  bs=1  skip=$skippedBytes | tee -a >(wc -c >&3) $file.output |\
     $($exportCommandString $file) > /dev/null ;  3>&1   )

Ele redireciona toda a saída para 3, que você criou com exec, e a retorna para um no final.

Você também precisa redirecionar todas as saídas de $ exportCommandString para / dev / null, caso contrário, ele será misturado com a saída wc.

Todo stderr funcionará normalmente, não há alterações.

p.s .: você pode usar tee -a file em vez de tee >(cat - >> file)) .

p.p .: você não pode exportar variáveis do subshell, que é sempre criado ao usar o canal | no bash ou $() . Então não há como fazer algo como

tee -a >(VAR=$(wc -c)) $file.output
    
por 09.03.2013 / 20:35
1

Talvez algo assim:

byteCount=$(tail -c +$skippedBytes $file | tee $file.output | wc -c)
    
por 09.03.2013 / 20:32

Tags