Przekaż potok do polecenia, które oczekuje nazwy pliku

19

Że mam polecenie fooktóra przyjmuje argument nazwa_pliku foo myfile.txt. Irytujące, foonie czyta ze standardowego wejścia. Zamiast rzeczywistego pliku, chciałbym przekazać mu wynik innego polecenia (w rzeczywistości pv, który przechwyci plik i wyświetli miernik postępu jako efekt uboczny).

Czy istnieje sposób, aby tak się stało? Wydaje się, że nic w mojej torbie sztuczek tego nie robi.

( foow tym przypadku jest to skrypt PHP, który moim zdaniem przetwarza plik sekwencyjnie).

Używam Ubuntu i Bash

EDYCJA Przepraszam za nieco niejasny opis problemu, ale oto odpowiedź, która robi to, co chcę:

pv longfile.txt | foo /dev/stdin

Teraz to bardzo oczywiste.

Steve Bennett
źródło
Szukasz jednej linijki?
Dave Forgac,
Czy jesteś pewien, że foo nie przyjmuje argumentu „-”, aby odczytać go ze standardowego wejścia?
rackandboneman
Niestety tak, w tym przypadku - jest to skrypt php.
Steve Bennett,
Tak, właściwie .
Steve Bennett

Odpowiedzi:

19

Jeśli rozumiem, co chcesz zrobić poprawnie, możesz to zrobić za pomocą funkcji zastępowania poleceń bash:

foo <(somecommand | pv)

To robi coś podobnego do tego, co mkfifosugerują oparte na odpowiedziach, z tym wyjątkiem, że bash obsługuje szczegóły dla ciebie (i kończy się przekazywaniem polecenia takiego jak / dev / fd / 63 zamiast zwykłej nazwanej potoku). Możesz być w stanie zrobić to jeszcze bardziej bezpośrednio:

somecommand | pv | foo /dev/stdin
Gordon Davisson
źródło
1
och, miło! Właśnie pv inputfile.txt | foo /dev/stdintego szukałem, ale nie myślałem.
Steve Bennett,
Woot! / dev / stdin
sage
<(.)pracował dla mnie. Czy ta składnia jest udokumentowana w podręczniku Bash? Rozumiem, (.)że podstawianie poleceń jest udokumentowane, ale nie widziałem ich kombinacji z <wyjaśnieniem.
flow2k
@ flow2k Nazywa się to „podstawieniem procesu” - patrz sekcja 3.5.6 podręcznika bash .
Gordon Davisson
Rozumiem. Masz rację - wspomina, że ​​używa nazwanych potoków / mkfifo.
flow2k
2
ARRAY=(`pv whatever`); for FILE in $ARRAY; do foo $FILE; done
Hippy
źródło
1

Spróbuj użyć mkfifo.

mkfifo file_read_by_foo; pv ... > file_read_by_foo 

W innej powłoce uruchom foo file_read_by_foo

coraz bardziej
źródło
0

xargs wydaje się działać dobrze do tego:

echo longfile.txt | xargs pv
MadHatter obsługuje Monikę
źródło
To robi coś innego: działa pvwiele razy, z których każda zawiera jedną lub więcej linii longfile.txt. Wcale nie o to mi chodzi.
Steve Bennett