Я использую интерактивную программу командной строки в терминале Linux выполнение оболочки удара. У меня есть определенная последовательность команды, которую я ввел к программной оболочке. Программа пишет свой вывод в стандартный вывод. Одна из этих команд является командой 'сохранения', которая пишет вывод предыдущей команды, которая была выполнена в файл к диску.
Типичный цикл:
$prog
$$cmdx
$$<some output>
$$save <filename>
$$cmdy
$$<again, some output>
$$save <filename>
$$q
$<back to bash shell>
Как я могу автоматизировать этот процесс? Я хотел бы записать сценарий оболочки, который может запустить эту программу и цикл через шаги, подав его команды один за другим и, и затем выход. Я надеюсь, что команда сохранения работает правильно.
Если вашей команде все равно, насколько быстро вы вводите ее, и вам действительно не нужно взаимодействовать с ней , тогда вы можете использовать heredoc.
Пример:
#!/bin/bash
prog <<EOD
cmdx
save filex
cmdy
save filey
q
EOD
Если вам нужно ветвление на основе вывода программы, или если ваша программа вообще чувствительна к времени выполнения ваших команд, тогда Expect - это то, что вам нужно.
Я рекомендую вам использовать Expect. Этот инструмент предназначен для автоматизации интерактивных приложений оболочки.
Для простых случаев использования вы можете использовать комбинацию подоболочки, эха и сна:
# in Terminal.app
telnet localhost 25
helo localhost
ehlo localhost
quit
(sleep 5; echo "helo localhost"; sleep 5; echo "ehlo localhost"; sleep 5; echo quit ) |
telnet localhost 25
Я использую Expect для взаимодействия с оболочкой для резервного копирования коммутатора и маршрутизатора. Сценарий bash вызывает ожидаемый сценарий с правильными переменными.
for i in <list of machines> ; do expect_script.sh $i ; exit
Это установит ssh в каждое поле, запустит команды резервного копирования, скопирует соответствующие файлы, а затем перейдет к следующему ящику.