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.


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

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


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


0

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

echo longfile.txt | xargs pv

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.