Скажем , у меня есть команда , foo
которая принимает имя файла аргумент: foo myfile.txt
. Досадно, foo
не читает со стандартного ввода. Вместо реального файла я хотел бы передать ему результат другой команды (в действительности pv
, которая будет отслеживать файл и выводить индикатор выполнения в качестве побочного эффекта).
Есть ли способ сделать это? Ничто в моей сумке трюков, кажется, не делает этого.
( foo
в данном случае это PHP-скрипт, который, я считаю, обрабатывает файл последовательно).
Я использую Ubuntu и Bash
РЕДАКТИРОВАТЬ Извините за немного неясное описание проблемы, но вот ответ, который делает то, что я хочу:
pv longfile.txt | foo /dev/stdin
Очень очевидно теперь, когда я это вижу.
Ответы:
Если я понимаю, что вы хотите сделать правильно, вы можете сделать это с помощью функции подстановки команд в bash:
Это делает что-то похожее на то, что
mkfifo
предлагают ответы на основе, за исключением того, что bash обрабатывает детали для вас (и в итоге он передает в команду что-то вроде / dev / fd / 63, а не обычный именованный канал). Вы также можете сделать это еще более прямо, как это:источник
pv inputfile.txt | foo /dev/stdin
именно то, что я искал, но не думал.<(.)
работал на меня. Задокументирован ли этот синтаксис в руководстве по Bash? Я понимаю,(.)
как подстановка команды задокументирована, но не видела ее комбинации с<
объясненной.mkfifo
.источник
На этот вопрос Unix SE есть ответ, который показывает, как создать временный именованный канал:
Shell Script mktemp, каков наилучший способ создания временного именованного канала?
Основываясь на ответах, вы можете сделать что-то вроде следующего:
Затем вы можете посмотреть трубу с:
Затем удалите его, когда закончите.
источник
Попробуйте использовать mkfifo.
В другой оболочке запустите foo file_read_by_foo
источник
xargs
кажется, хорошо работает для этого:источник
pv
несколько раз, каждый с одной или несколькими линиямиlongfile.txt
. Не совсем то, что я здесь после.