Por que o du -sk não reporta o tamanho de um fifo?

1

Existe um conceito em bash chamado substituição de processo. Você pode executar um comando e usar a saída como um arquivo.

por exemplo,

$ cat -n <(seq 3|tac)
     1  3
     2  2
     3  1

Estou curioso para saber o seguinte:

$ du -sk <(xzcat /var/log/mpd/scribble.log.xz )
0   /dev/fd/63

Da mesma forma, temos isso

$ file <(seq 1 2)
/dev/fd/63: broken symbolic link to pipe:[32560687]

O arquivo não está vazio.

$ xzcat /var/log/mpd/scribble.log.xz  | wc -c 
16877047

>/dev/null  pv  <(xzcat /var/log/mpd/scribble.log.xz ) 
16.1MiB 0:00:00 [ 232MiB/s] [  <=>                   ]

Como uma questão bônus, você conhece uma técnica no bash para masquarade fifos como arquivos regulares por um curto período de tempo?

    
por Ярослав Рахматуллин 08.09.2017 / 22:37

1 resposta

1

Arquivos regulares consistem em três componentes principais:

  1. Nome (link de hardware)
  2. Inode (informações do sistema)
  3. Corpo (dados)

Tubulações (não importando nome ou anônimas, persistentes ou temporárias) não têm corpo. Portanto, eles sempre têm tamanho zero, diferente dos arquivos comuns. Eles só têm buffer na memória. É por isso que o pipe anônimo / dev / fd / 63 tem tamanho zero. Você poderia usar qualquer outro comando dentro do operador < (...) com o mesmo resultado, digamos

du -sk <(cat somefile)

Você pode criar o pipe nomeado com o comando mkfifo para ver que seu tamanho é sempre igual a zero mesmo se você preencher completamente o buffer. Na verdade, o tamanho do arquivo de pipes nomeados (e quaisquer outros) não tem sentido real e é definido como zero para uniformidade de listagem entre outros arquivos.

    
por 12.09.2017 / 23:33

Tags