Como funciona o pv?

1

Como funciona o seguinte comando?

pv file.tar.gz | tar -xz

Pelo que entendi, o operador de pipe | cria um pipe e stdout de pv é mapeado para a O_WRONLY final do canal e tar ' stdin é mapeado para o O_RDONLY com O_WRONLY e O_RDONLY existentes em pipefs

Tudo isso é bom, mas o seguinte está sendo impresso na minha tela:

31.1MiB 0:00:05 [6.17MiB/s] [===================================>] 100%

Pelo que eu saiba, essa barra de progresso não é gerada por tar , porque estaria disponível por meio de uma opção, se fosse, e eu não precisaria de pv , portanto, pv precisa gerá-la. Mas como? pv stdout está mapeado para O_WRONLY .

Eu também li que alguns shells usam pares de soquetes para pipes no lugar de pipefs e pares de soquetes são bidirecionais. Mas isso parece apenas amarrar stdin e stdout de ambos os comandos até que um ou ambos sejam concluídos. o que não é o caso no exemplo acima, já que a barra de progresso é atualizada em tempo real.

    
por CaffeineAddiction 13.02.2017 / 22:13

1 resposta

7

A barra de progresso é um recurso do pv , está escrito em erro padrão. Do manual pv :

pv shows the progress of data through a pipeline by giving information such as time elapsed, percentage completed (with progress bar), current throughput rate, total data transferred, and ETA.

To use it, insert it in a pipeline between two processes, with the appropriate options. Its standard input will be passed through to its standard output and progress will be shown on standard error.

Não há realmente nenhum problema em gravar no TTY e, ao mesmo tempo, redirecionar a saída padrão e o erro padrão:

$ ( echo "out"; echo "error" >&2; echo "hi there" >$(tty) ) 2>&1 | cat >file
hi there

$ cat file
out
error

Além disso, O_WRONLY e O_RDONLY não são substantivos, mas adjetivos. A saída padrão é somente para gravação e a entrada padrão é somente leitura.

    
por 13.02.2017 / 22:34

Tags