Как ссылаться на stdin как опцию в программе в конвейере?

0

У меня есть программа, которая выводит файл, который я хочу использовать в качестве стандартного ввода для следующей программы. Однако у program2 есть опции «-in» и «-out», которым нужны имена файлов. Так что, если я подключаюсь к программе 2, как я могу сослаться на стандартный ввод для опции "-in"?

program1 | program2 -in stdin -out filename
Майкл
источник

Ответы:

3

Если program2он не использует свой стандартный ввод и -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
  • Названный fifo (способ POSIX)

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

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

Камиль Мачоровски
источник
1
Я бы порекомендовал / dev / stdin вместо / proc / [self] / fd / 0 - это также не требуется для POSIX, но, похоже, гораздо более широко поддерживается, чем / proc. Смотрите здесь и здесь .
Гордон Дэвиссон
1

Вы можете сделать что-то вроде

program1 > stdin & program2 -in stdin -out filename

На самом деле это не труба, но все stdout для program1 будет помещен в файл stdin, чтобы программа могла его прочитать.

В качестве альтернативы некоторые программы используют сокращение - когда они пытаются читать / писать из оболочки. Так что это может быть как:

program1 | program2 -in - -out filename
user1330614
источник
1

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

program1 | program2 -in /dev/stdin -out filename
kenorb
источник