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

program1 | program2 -in stdin -out filename

3 ответа3

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 вы можете сделать так, чтобы дескриптор файла 0 program2 указывал на файл bar который можно найти, но, как правило, stdin не доступен для поиска, поэтому такие программы не будут его использовать. Каждый из вышеперечисленных методов может привести к сбою вашей программы, если он ожидает, что файл будет доступен для поиска.

1

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

program1 > stdin & program2 -in stdin -out filename

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

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

program1 | program2 -in - -out filename
1

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

program1 | program2 -in /dev/stdin -out filename

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .