Prozessersetzung durch Perl-Skript
Ich habe ein Perl- Skript, das die folgenden Argumente erfordert:
count.pl OUTPUT_FILE INPUT_FILE
Ich möchte die Prozessersetzung verwenden, anstatt INPUT_FILE explizit anzugeben, zum Beispiel:
count.pl count.txt <(cat test.txt)
Es scheint jedoch, dass das Skript keine Eingaben von der Prozessersetzung erhält.
Was mache ich falsch?
Antworten
Die Script - Anwendungen-T the-source-file , um zu bestimmen , ob die Datei enthält Text .
Dieser -TOperator liest den Anfang der Datei und verwendet Heuristiken, um zu bestimmen, ob sie wie Text aussieht oder nicht. Wenn es sich bei der Datei jedoch um eine Pipe handelt <(...), kann das Gelesene nicht erneut gelesen werden.
Sie können reproduzieren mit:
$ perl -e '$file = shift; -T $file; open F, "<", $file; print while <F>' <(seq 1867)
1861
1862
1863
1864
1865
1866
1867
Sehen Sie, wie -T8 KB verbraucht wurden, von deren Ausgabe seqdie while <F>Schleife nicht mehr gelesen werden kann.
Hier können Sie zsh und seine =(...)Form der Prozessersetzung verwenden, bei der eine temporäre Datei anstelle einer Pipe verwendet wird. Oder (... | psub -f)in der fishSchale. Oder entfernen Sie diesen Aufruf von -Taus diesem Skript. Oder schreiben Sie das Skript neu, damit es mit <<>>/ funktioniert <>( es funktioniert also auch mit stdin, wenn kein Dateiargument übergeben wird) und gibt es mit stdout aus. Ich sehe es nicht wirklich als sinnvoll an, Dateinamen als Argumente zu verwenden, da sie alle in einem Stream verarbeitet werden.