Передайте трубу команді, яка очікує імені файлу


19

Скажімо , у мене є команда , fooяка приймає ім'я файлу аргумент: foo myfile.txt. Прикро, fooне читається зі стандартного вводу. Замість фактичного файлу я хотів би передати його результатом іншої команди (насправді pv, яка буде визначати файл і виводити метр прогресу як побічний ефект).

Чи є спосіб це зробити? Ніщо в моїй сумці хитрощів, здається, це не робить.

( fooу цьому випадку це PHP-скрипт, який, я вважаю, обробляє файл послідовно).

Я використовую Ubuntu та Bash

EDIT Вибачте за дещо незрозумілий опис проблеми, але ось відповідь, яка робить те, що я хочу:

pv longfile.txt | foo /dev/stdin

Дуже очевидно зараз, коли я це бачу.


Шукаєте однолінійку?
Дейв Forgac

Ви впевнені, що foo не приймає аргумент "-", щоб прочитати його з stdin?
rackandboneman

На жаль, так, у цьому випадку - це сценарій php.
Стів Беннетт

Так, насправді. .
Стів Беннетт

Відповіді:


19

Якщо я зрозумів, що ви хочете зробити належним чином, ви можете зробити це за допомогою функції підстановки команд bash:

foo <(somecommand | pv)

Це робить щось подібне до того, що mkfifoпропонують відповіді на основі, за винятком того, що bash обробляє деталі для вас (і він закінчується передачею команди, як / dev / fd / 63, а не регулярною названою трубкою). Ви також можете це зробити ще більш безпосередньо, як це:

somecommand | pv | foo /dev/stdin

1
о, приємний! Це pv inputfile.txt | foo /dev/stdinсаме те, що я шукав, але не думав.
Стів Беннетт

Вуто! / dev / stdin
мудрець

<(.)працював на мене. Цей синтаксис задокументований у посібнику Bash? Я розумію, (.)як заміна команди задокументована, але не бачила її поєднання з <поясненою.
flow2k

@ flow2k Це називається "заміна процесу" - див. розділ 3.5.6 посібника з bash .
Гордон Девіссон

Зрозумів. Ви маєте рацію - згадується, що він використовує названі труби / mkfifo.
flow2k


2

На це запитання Unix SE є відповідь, яка показує, як створити тимчасову назву труби:

Shek Script mktemp, який найкращий метод для створення тимчасової названої труби?

Виходячи з відповідей там, ви можете зробити щось подібне:

tmppipe=$(mktemp -u)
mkfifo -m 600 "$tmppipe"
pv examplefile > $tmppipe

Потім ви могли дивитися трубу за допомогою:

foo $tmppipe

Потім видаліть його, коли закінчите з ним.



0

xargs Здається, для цього добре працює:

echo longfile.txt | xargs pv

Це робить щось інше: виконання pvдекількох разів, кожен з яких має одну чи кілька ліній longfile.txt. Зовсім не те, що я тут проживаю.
Стів Беннетт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.