Назад | Перейти на главную страницу

Передайте канал команде, которая ожидает имя файла

Скажем, у меня есть команда 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