2013-11-22 2 views
0

В настоящее время у меня есть набор сценариев установки, которые записывают stderr/stdout в файл журнала, который работает хорошо, но мне также нужно перенаправить stdin для пользователя ответы на один и тот же файл журнала. Сценарии установки иногда используются в общей библиотеке (включая), которая также может считывать ввод пользователя. Я думал о добавлении пользовательской функции чтения, но это потребует изменения общей библиотеки и задается вопросом, есть ли способ сделать это из вызывающего сценария.Bash: Как перенаправить stdin, stdout и stderr в файл журнала для журнала установки

В настоящее время сценарии похожи на это:

#!/usr/bin/bash 

. ./libInstall 

INSTALL_LOG="./install.log" 
((

echo "INFO: Installing..." 
# Run some arbitrary commands... 
# Read some input... 
read ANSWER1 
read ANSWER2 
# Call function in libInstall which will prompt the user... 
funcWhichAsksAQuestion ANSWER3 

echo "INFO: Installation Complete" 

) 2>&1) | tee -a "${INSTALL_LOG}" 

Если я изменю «((», чтобы отразить линию ниже я могу тройник от стандартного ввода в файл журнала:

кошки - 2 >/dev/null | tee -a $ {INSTALL_LOG} | ((

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

Эти сценарии должны быть достаточно переносимыми для работы на RHEL> = 5, AIX> = 5.1, Solaris> = 9 с самой низкой версией bash, являющейся v2.05.

Любые идеи, как я могу это достичь?

Благодаря

+1

Вы не можете перенаправить 'stdin' в файл. вы можете перенаправить 'stdin' из файла. – anishsane

+0

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

ответ

0

Почему бы не просто добавить «эхо„\ п \ п“» после того, как ваша «установка завершена» линия? Конечно, у вас будет две дополнительные строки в вашем файле журнала, но они кажутся относительно безвредными.

Я считаю, что вам нужно вернуться дважды из-за того, как используется тройник. Он «использует» один возврат сам по себе, а два других - из «прочитанных» вызовов (ну, один прочитанный, один funcWhichAsksAQuestion).

Смежные вопросы