Substituição de processo com script Perl

Sep 30 2020

Eu tenho um script Perl que requer os seguintes argumentos:

count.pl OUTPUT_FILE INPUT_FILE

O que eu quero fazer é usar a substituição do processo em vez de especificar INPUT_FILE explicitamente, por exemplo:

count.pl count.txt <(cat test.txt)

No entanto, parece que o script não recebe nenhuma entrada da substituição do processo.

O que estou fazendo de errado?

Respostas

7 StéphaneChazelas Sep 30 2020 at 18:31

O script usa-T the-source-file para determinar se o arquivo contém texto .

Esse -Toperador lê o início do arquivo e usa heurísticas para determinar se ele se parece com texto ou não. Mas se o arquivo for um tubo como no <(...)caso, o que foi lido não pode ser lido novamente.

Você pode reproduzir com:

$ perl -e '$file = shift; -T $file; open F, "<", $file; print while <F>' <(seq 1867)

1861
1862
1863
1864
1865
1866
1867

Veja como -Tconsumiu 8 KiB da saída de seqque não estão mais lá para o while <F>loop ler.

Aqui, você pode usar zsh e sua =(...)forma de substituição de processo que usa um arquivo temporário em vez de um pipe. Ou (... | psub -f)na fishcasca. Ou remova a chamada para -Tdesse script. Ou reescreva esse script para que funcione com <<>>/ <>(para que funcione também em stdin quando nenhum argumento de arquivo for passado) e produza em stdout. Eu realmente não vejo o ponto de tomar nomes de arquivo como argumentos, uma vez que processa todos eles em um fluxo contínuo.