Переключиться с содержимого файла на STDIN в конвейерной команде? (Linux Shell) - PullRequest
7 голосов
/ 13 октября 2009

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

То, что я хотел бы сделать, это кошка файла, содержащего команды в программе, через канал, а затем использовать какую-то магию оболочки, чтобы он переключался с файла на STDIN, когда достигнет EOF файла.

Примечание: я уже рассматривал возможность использования cat с '-' для STDIN. К сожалению (я не знал этого раньше), переданные по очереди команды piped ожидают завершения вывода первой программы - они не работают параллельно. Если есть какой-нибудь способ заставить программы работать параллельно с этим действием, это сработает!

Есть мысли? Спасибо за любую помощь!

РЕДАКТИРОВАТЬ:

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

Ответы [ 4 ]

15 голосов
/ 14 октября 2009

Я бы сделал что-то вроде

(cat your_file_with_commands; cat) | sh your_script

Таким образом, когда файл с командами будет готов, вторая cat будет кормить ваш скрипт тем, что вы потом наберете на stdin.

2 голосов
/ 04 июня 2015

То же, что и в идеальном ответе с более простым синтаксисом;)

cat your_file_with_commands - | sh your_script
2 голосов
/ 13 октября 2009

Я думаю, что expect будет работать для этого.

1 голос
/ 13 октября 2009

Вы пытались использовать что-то вроде tail -f commandfile | command Я думаю, что это должно передать строки файла в команду, не закрывая дескриптор файла впоследствии. Используйте -n, чтобы указать количество строк для передачи, если tail -f не перехватит их все.

...