Że mam polecenie foo
która przyjmuje argument nazwa_pliku foo myfile.txt
. Irytujące, foo
nie 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.
( foo
w 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.
Odpowiedzi:
Jeśli rozumiem, co chcesz zrobić poprawnie, możesz to zrobić za pomocą funkcji zastępowania poleceń bash:
To robi coś podobnego do tego, co
mkfifo
sugerują 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:źródło
pv inputfile.txt | foo /dev/stdin
tego szukałem, ale nie myślałem.<(.)
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.mkfifo
.źródło
Na to pytanie Unix SE znajduje się odpowiedź, która pokazuje, jak utworzyć tymczasową nazwaną potok:
Shell Script mktemp, jaka jest najlepsza metoda tworzenia tymczasowej nazwanej potoku?
Na podstawie zawartych tam odpowiedzi możesz wykonać następujące czynności:
Następnie możesz obejrzeć fajkę za pomocą:
Następnie usuń go, gdy skończysz.
źródło
Spróbuj użyć mkfifo.
W innej powłoce uruchom foo file_read_by_foo
źródło
xargs
wydaje się działać dobrze do tego:źródło
pv
wiele razy, z których każda zawiera jedną lub więcej liniilongfile.txt
. Wcale nie o to mi chodzi.