我正在编写 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 -rd
screen
答案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
:阻塞直到找到提示符,并提供安装脚本的新路径。