如何响应后台运行的 shell 脚本中的提示?

如何响应后台运行的 shell 脚本中的提示?

我正在编写 HP-UX 服务器上软件安装的脚本。脚本启动后,它会提示我输入安装路径。我需要将路径传递给脚本,以便它可以继续运行。脚本中只有 1 个地方存在此需求。

脚本的提示是: Press ENTER for default path or Enter path to install software:

我不想使用默认路径,因此必须输入新路径。但这个脚本将在后台运行,我需要提供路径。我不确定脚本形式的确切响应。

答案1

您可以使用管道将您的答案回显到脚本的标准输入中。

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

答案2

如果您可以在脚本启动时提供所有输入,那么可以通过重定向程序的输入。也就是说,不是运行/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

如果您想时不时地与程序交互,但同时又使用终端进行其他操作,请在以下环境中运行该程序:终端复用器例如屏幕或者多路复用器。使用 screen,通过运行 启动会话screen,然后启动程序。要执行其他操作,请按+Ctrl创建第二个窗口,然后按+在窗口之间导航。要退出屏幕但保持程序运行,请按+ , (“分离”)。要返回到现有的 Screen 会话,请运行(如果没有选项将启动新会话)。AcCtrlAnCtrlAdscreen -rdscreen

答案3

要提供自动答案,您可以使用以下方法之一:

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:阻塞直到找到提示符,并提供安装脚本的新路径。

相关内容