Перенаправить ввод с кода или терминала на работающий код или терминал?


3

В настоящее время я использую программный скрипт, который требует непрерывного ввода через терминал. Сценарий оценивает файлы непрерывно, получая входные данные пути и оценивая файл в пути.

Цель : возможно ли запустить скрипт, требующий ввода, путем передачи ввода из другого терминала или скрипта.

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

Я могу упомянуть, что я попытался tty найти:
$ /dev/pts/19
затем через другой терминал запустить: $ <command> <myinput> > /dev/pts/19
где команда заменяется на «echo / print».
Однако, она просто печатает на другом терминале, она не действует как ввод в программное обеспечение.

Ответы:


2

Создайте именованный канал:

mkfifo pipe

Убедитесь, что он не закроется (см. Этот ответ ):

exec 3<>pipe

Подать ваш сценарий из трубы:

<pipe your_script.sh
# or if you want to see incoming data
<pipe tee >(your_script.sh)

Затем из другого терминала echo, printfили как угодно:

echo "/some/path/or/another/input" > pipe

или же

cat large_input.txt > pipe

или же

script_that_generates_input.sh > pipe

Но остерегайтесь состояния гонки! Не кормите трубу из двух или более источников одновременно; всегда ждите выхода текущей команды подачи, прежде чем запускать следующую. Обратите внимание, что если один источник передает много данных, он может удерживаться на полпути, пока принимающая сторона не обработает данные. Поместите mbuffer(с аргументами, которые соответствуют вашему случаю использования) перед тем, your_script.shчтобы создать буфер, который может хранить больше входящих данных, прежде чем любая команда подачи будет приостановлена.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.