Скажем, у меня есть команда foo
который принимает аргумент имени файла: foo myfile.txt
. Досадно, foo
не читает со стандартного ввода. Вместо фактического файла я хотел бы передать ему результат другой команды (на самом деле, pv
, который откроет файл и выведет индикатор выполнения в качестве побочного эффекта).
Есть ли способ сделать это? Кажется, ничто из моего набора уловок не помогает.
(foo
в данном случае это PHP-скрипт, который, как мне кажется, обрабатывает файл последовательно).
Я использую Ubuntu и Bash
ИЗМЕНИТЬ Извините за немного неясное описание проблемы, но вот ответ, который делает то, что я хочу:
pv longfile.txt | foo /dev/stdin
Это очень очевидно сейчас, когда я это вижу.
Если я понимаю, что вы хотите сделать правильно, вы можете сделать это с помощью функции подстановки команд bash:
foo <(somecommand | pv)
Это делает нечто похожее на то, что mkfifo
-основные ответы предполагают, за исключением того, что bash обрабатывает детали за вас (и в итоге он передает команде что-то вроде / dev / fd / 63, а не обычный именованный канал). Вы также можете сделать это еще более прямо, например:
somecommand | pv | foo /dev/stdin
На этот вопрос Unix SE есть ответ, который показывает, как создать временный именованный канал:
Shell Script mktemp, как лучше всего создать временный именованный канал?
Основываясь на ответах, вы можете сделать что-то вроде следующего:
tmppipe=$(mktemp -u)
mkfifo -m 600 "$tmppipe"
pv examplefile > $tmppipe
Затем вы можете смотреть трубу с помощью:
foo $tmppipe
Затем удалите его, когда закончите с ним.
ARRAY=(`pv whatever`); for FILE in $ARRAY; do foo $FILE; done
Попробуйте использовать mkfifo.
mkfifo file_read_by_foo; pv ... > file_read_by_foo
В другой оболочке запустите foo file_read_by_foo
xargs
кажется, хорошо работает для этого:
echo longfile.txt | xargs pv