A substituição do processo rawtopng <(tail myfile) fileout
cria um canal (assim como tail myfile | rawtopng - fileout
) e passa um nome para o canal para o programa. No Linux, rawtopng
verá um nome como /dev/fd/42
e, se consultar o tipo de arquivo, será informado que é um canal. Nenhuma gravação no sistema de arquivos é necessária (isso é um pipe anônimo, não um pipe nomeado). Você pode ter um vislumbre do que está acontecendo, executando um comando como ls -ld <(echo foo)
Isso funcionará? Depende do que o comando rawtopng
requer (o que eu não sei, não estou familiarizado com esse comando). Se tudo o que fizer for lido no arquivo, tudo bem. Se precisar procurar no arquivo (ou seja, se não ler sua entrada linearmente do início ao fim), ou se precisar saber o tamanho da entrada antes de começar a funcionar, isso não funcionará. Em tais casos, você precisará de um arquivo temporário.
Se o comando precisar de entrada ou entrada procurada com um tamanho conhecido antecipadamente, então você não tem escolha, você precisa criar um arquivo temporário. Se você quiser evitar gravar em disco, pode organizar o arquivo em um sistema de arquivos tmpfs
, se suas variantes Unix oferecerem isso (o Linux faz). Você pode usar o comando mktemp
para criar um arquivo temporário:
tmp=$(TMPDIR=/tmp mktemp XXXXXXXXXXXX.raw)
rawtopng "$tmp" fileout
rm "$tmp"
Em zsh, a variante de substituição do processo rawtopng =(tail myfile) fileout
cria um arquivo temporário e o remove assim que o comando é concluído.
Outro caso em que a substituição do processo não é suficiente é se o programa insiste em um arquivo com uma extensão específica. Nesse caso, criar um canal nomeado pode ajudar:
mkfifo /tmp/foo.raw
tail myfile >/tmp/foo.raw &
rawtopng /tmp/foo.raw fileout
rm /tmp/foo.raw