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

cat initial_input.txt | myprogram myindex myoptions - | filter_output > outfile.txt

Программа загружает структуру данных (myindex) перед началом обработки ввода, и это может занять довольно много времени. Часть выходных данных может быть возвращена в программу. Я хочу передать часть стандартного вывода обратно в стандартный ввод, который принимает программа, чтобы он добавлялся в конце начального ввода, с которым была вызвана программа, без прерывания начального выполнения программы, поскольку для начальной загрузки myindex требуется время внутрь.

Есть способ сделать это?

1 ответ1

3

Вы могли бы сделать это с помощью tail:

tail -f initial_input.txt -n 100000 | myprogram myindex myoptions - | filter_output >> initial_input.txt

Важные биты здесь:

  • хвост; Это работает так же, как cat, но (с опцией -f) он "следует" за концом файла, поэтому по мере роста файла он выводит больше данных в стандартный вывод. Опция -n указывает, сколько строк нужно выгрузить изначально (по умолчанию я думаю, что это всего 10), поэтому вам нужно, чтобы это число было как минимум таким же большим, как исходное количество строк в файле.
  • ; Обратите внимание, в конце я использую >> вместо> как в вашем вопросе. Это говорит оболочке добавлять, а не перезаписывать существующий файл.

Помните, что это потенциально может быть "опасным" занятием, если вы не находитесь в жестко контролируемой среде. И что я подразумеваю под "жестко контролируемым", так это то, что вы знаете, что никто не будет читать или писать в ваш файл initial_input.txt. Если более одного процесса пытается записать в этот файл одновременно, вы получите мусор из него. Но похоже, что вы, вероятно, работаете с файлами, которые только вы когда-либо изменяли, и вы помещаете их туда самостоятельно, так что вы должны быть в безопасности.

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