Intereting Posts
ext4: Как учесть пространство файловой системы? apt-get обновление и проверка пакетов Сценарий для отправки оповещения по электронной почте только при изменении процесса динамические стопки на консоли Как я могу перечислить каждый файл в каталоге, кроме тех, у которых указаны указанные расширения? заставить networkmanager не запрашивать пароль после неудачного соединения? Создать раздел (стандартный раздел и физический том LVM) в установке CentOS Как я могу создать «режим киоска CLI» при запуске системы? Что произойдет, если я запустил fsck в / dev / sda вместо / dev / sda1? Как запустить процесс и узнать, сколько памяти он использует? Как можно скрыть короткие клавиши X11 программой Python? Tomcat 7 не производит выход журналов для каталинии. На RHEL7 Требуется ли время для использования процессора? Подмножество содержимого файла на основе значения в столбце Почему редактирование core_pattern ограничено?

Как я могу ответить на приглашение в сценарии оболочки, работающем в фоновом режиме?

Я занимаюсь написанием установки программного обеспечения на сервере HP-UX. После запуска скрипта выдается приглашение, где я должен ввести путь установки. Мне нужно передать путь к скрипту, чтобы он продолжал работать. В сценарии есть только 1 место, где эта потребность существует.

Запрос из сценария: Нажмите ENTER для пути по умолчанию или введите путь для установки программного обеспечения:

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

Вы можете повторить свой ответ на стандартный ввод сценария, используя канал.

echo "My/Path/not/default"| yourscript.sh 

Если вы можете предоставить все входы при запуске скрипта, сделайте это, перенаправив ввод программы. То есть вместо запуска /path/to/installer запустите

 { echo '/the/path/where/to/install'; echo 'answer to the second prompt'; } | /path/to/installer 

или используйте здесь документ :

 /path/to/installer <<'EOF' /the/path/where/to/install answer to the second prompt EOF , /path/to/installer <<'EOF' /the/path/where/to/install answer to the second prompt EOF 

Если вы хотите время от времени взаимодействовать с программой, но используете терминал для других вещей между ними, запустите программу в терминальном мультиплексоре, таком как Screen или tmux . С помощью экрана запустите сеанс, запустив screen , затем запустите программу. Чтобы сделать что-то еще, нажмите Ctrl + A , c, чтобы создать второе окно, затем Ctrl + A , n, чтобы перемещаться между окнами. Чтобы выйти из экрана, но оставьте программу нажатой , нажмите Ctrl + A , d («отсоединить»). Чтобы вернуться к существующей сессии экрана, запустите screen -rd ( screen без опции начнет новый сеанс).

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

 insaller.sh < an_input_file 

или

 command-line | installer.sh 

Есть что сказать, если скрипт installer.sh использует read -p , как в примере ниже:

 read -p "Press ENTER for default path or enter path to install software:" answer 

man bash указывает, что ничего не печатается, если стандартный ввод не является терминалом.

Если это ваша ситуация, вы можете попробовать эту странную вещь:

 ( sleep 30 ; printf "/my/own/path\n" ) | insaller.sh 

Вы должны адаптировать количество секунд ( 30 в приведенном выше примере) к вашей ситуации.

Если произойдет, что read -p не используется внутри скрипта установки, вы можете попробовать это решение GNU :

  tempdir="$(mktemp -d)" mkfifo "${tempdir}"/input touch "${tempdir}"/output.log ./installer.sh <"${tempdir}"/input >"${tempdir}"/output.log 2>&1 & installerpid=$! tail --pid=$installerpid -fn 1 "${tempdir}"/output.log | ( fgrep -q "Press ENTER for default path or enter path to install software:"; printf "/new/path\n" ) >> "${tempdir}"/input & # ... do stuff # before ending the script, just wait that all background processes stop wait rm -f "${tempdir}"/input "${tempdir}"/output.log 

Идея состоит в том, чтобы использовать 2 справочных командных строки, одну для сценария установки, а одну – ждать приглашения и предоставить ответ.

Для связи используются именованный канал ( input ) и обычный файл ( output.log ).

tail --pid=$installerpid -fn 1 "${tempdir}"/output.log печатает строки, поскольку они записаны в файле output.log . Он запускается при завершении сценария установщика.

( fgrep -q ... ; printf .. ) >> ...input : блокирует до появления подсказки и предоставляет новый путь к скрипту установки.