Консольный вывод программы, включающей перенаправленный stdin?

#bash #stdin #io-redirection

#bash #stdin #ввод-перенаправление

Вопрос:

У меня есть программа командной строки, в которую я передаю перенаправленный ввод и передаю в файл:

 ./program < some_input_file > some_output_file
  

Очевидно, что это записывает вывод, не включающий перенаправленный ввод. Есть ли какой-нибудь простой способ получить журнал программы, включая перенаправленный ввод, который я ввел?

Я открыт для использования внешней программы или скрипта — я запускаю это на bash / linux.

[ПРАВИТЬ]

Я ищу способ чередования выходных данных — как если бы программа была запущена в терминале, с входным файлом, просто введенным вручную

Комментарии:

1. Вы всегда можете cat input > output; ./program < input >> output но это то, чего вы хотите?

2. Смотрите мой ответ ниже для последовательных и параллельных комбинаций

Ответ №1:

Ниже приведен пример того, как вы можете это сделать:

 > cat input.txt
asdf
qwer
zxcv
> tee output.txt < input.txt | cat >> output.txt 
> cat output.txt
asdf
qwer
zxcv
asdf
qwer
zxcv
  

Просто замените cat в приведенном выше на свою программу, и у вас все должно получиться. Теперь, если вы хотите, чтобы он чередовался, вам нужно сделать что-то другое:

 > while read line
  do
      echo $line >> output.txt
      echo $line | cat >> output.txt
  done < 'input.txt'
> cat output.txt
asdf
asdf
qwer
qwer
zxcv
zxcv
  

снова замена cat вашим сценарием оболочки.

Комментарии:

1. Вам также нужно убедиться, что ваша программа cat также очищает свой выходной буфер при каждой записи (или, как минимум, при каждом чтении из stdin).

2. Не требует ли это завершения программы cat перед тем, как мы перейдем к следующей итерации цикла? Другими словами, это приведет к запуску cat один раз для каждой строки в моем входном файле?

3. @andy @thekidder Вот пара вещей. Я понятия не имею, что за программа здесь. Это черный ящик, но в ответ на первоначальный вопрос я привел примеры, показывающие, как создавать желаемый вывод последовательно и параллельно. Если вам нужно что-то более эффективное, я бы рассмотрел возможность использования потоков в вашей программе для решения этой проблемы, а не просто полагаться на средства, предоставляемые оболочкой.

4. Ваш «чередующийся» пример может работать только в том случае, если повторный вызов операционной системы «программа командной строки» для каждой строки ввода приводит к тому же результату, что и вызов ее только один раз со всем вводом; операционная система не указала это ограничение.

Ответ №2:

Если ваша программа выводит какое-либо приглашение перед чтением следующего ввода, вы можете использовать expect для взаимодействия с ним. Ваш expect скрипт может печатать каждую строку ввода по мере ее чтения и отправлять ее программе, как только она увидит приглашение. Это дает вам правильный чередующийся вывод без запуска вашей программы один раз на строку.