Sostituzione del processo con script Perl
Ho uno script Perl che richiede i seguenti argomenti:
count.pl OUTPUT_FILE INPUT_FILE
Quello che voglio fare è utilizzare la sostituzione del processo invece di specificare INPUT_FILE esplicitamente, ad esempio:
count.pl count.txt <(cat test.txt)
Tuttavia, sembra che lo script non riceva alcun input dalla sostituzione del processo.
Cosa sto sbagliando?
Risposte
Lo script utilizza-T the-source-file per determinare se il file contiene testo .
Questo -Toperatore legge l'inizio delle euristiche file e utilizza per determinare se sembra che il testo oppure no. Ma se il file è una pipe come nel <(...)caso, ciò che ha letto non può essere letto di nuovo.
Puoi riprodurre con:
$ perl -e '$file = shift; -T $file; open F, "<", $file; print while <F>' <(seq 1867)
1861
1862
1863
1864
1865
1866
1867
Guarda come -Tha consumato 8KiB dal cui output seqnon ci sono più per il while <F>ciclo da leggere.
Qui è possibile utilizzare zsh e la sua =(...)forma di sostituzione del processo che utilizza un file temporaneo invece di una pipe. O (... | psub -f)nel fishguscio. Oppure rimuovi quella chiamata a -Tda quello script. Oppure riscrivi lo script in modo che funzioni con <<>>/ <>(quindi funzionerebbe anche su stdin quando non viene passato alcun argomento del file) e restituisce lo stdout. Non vedo davvero il punto di prendere i nomi dei file come argomenti poiché li elabora tutti in modo fluido.