Як посилатися на stdin як на опцію в програмі на конвеєрі?


0

У мене є програма, яка виводить файл, який я хочу використовувати як stdin для наступної програми. Однак у програмі2 є параметри "-in" та "-out", які бажають назви файлів. Отже, якщо я перекладаю програму2, то як я можу посилатись на stdin для параметра "-in"?

program1 | program2 -in stdin -out filename

Відповіді:


3

Якщо program2він не використовує сам stdin і -inє єдиним способом вказати вхідний файл, це корисні варіанти:

  • /proc/self/fd/0або /proc/fd/0(за наявності; функція ядра, не потрібна POSIX)

    program1 | program2 -in /proc/self/fd/0 -out filename
  • Заміна процесу (підтримується в Bash та кількох інших оболонках, не вимагається POSIX)

    program2 -in <(program1) -out filename
  • Фамільна назва (спосіб POSIX)

    mkfifo foo
    program1 >foo &   # in background
    program2 -in foo -out filename
    rm fifo

Зауважте, що багато програм, які зазвичай не використовують свій stdin, ведуть себе таким чином не просто так: їм потрібно вводити вхідний файл. З <bar program2Ви можете зробити дескриптор файлу 0 з program2точки в barфайл , який є доступним для пошуку, але в цілому не є стандартним вводом доступним для пошуку, так що такі програми не турбувати його використання. Кожен з перерахованих вище методів може призвести до відмови вашої програми, якщо він очікує, що файл буде шукати.


1
Я б рекомендував / dev / stdin замість / proc / [self] / fd / 0 - POSIX також його не вимагає, але, здається, він набагато більше підтримується, ніж / proc. Дивіться тут і тут .
Гордон Девіссон

1

Можна зробити щось на кшталт

program1 > stdin & program2 -in stdin -out filename

Це насправді не труба, але поставить все stdout program1 всередині stdin-файлу, щоб програма2 змогла його прочитати.

Крім того, деякі програми використовують скорочення - коли вони намагаються читати / писати з оболонки. Так це може бути як:

program1 | program2 -in - -out filename

1

Наступний синтаксис повинен працювати в оболонці, вказуючи вхідний файл на спеціальний файл /dev/stdin:

program1 | program2 -in /dev/stdin -out filename
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.