Bash:如何将stdin、stdout和stderr重定向到安装日志的日志文件



我目前有一堆安装程序脚本,它们将stderr/stdout记录到一个运行良好的日志文件中,但我还需要将用户响应的stdin重定向到同一日志文件中。安装脚本有时会调用共享库(include)中的函数,该库也可以读取用户输入。我曾想过添加一个自定义的读取函数,但这需要更改共享库,我想知道是否有一种方法可以通过调用脚本实现这一点。

目前的脚本与此类似:

#!/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}"

如果我更改"("以反映下面的行,我可以将stdin转换为日志文件:

cat-2>/dev/null|tee-a${INSTALL_LOG}|(

这是可行的,但脚本结束后需要2个回车,可能是因为管道断了。它就快到了,但我希望它能工作,而不必在最后按两次回车键返回shell提示。

这些脚本必须是可移植的,才能在RHEL>=5、AIX>=5.1、Solaris>=9上运行,我相信最低的bash版本是v2.05。

有什么想法我可以做到这一点吗?

感谢

为什么不在"安装完成"行之后添加"echo"\n\n"?当然,您的日志文件中会有两行额外的行,但这些行看起来相对无害。

我相信您必须返回两次,因为tee是如何实现的。它自己"使用"一个返回,另外两个来自"read"调用(好吧,一个read,一个funcWhichAsksAQuestion)。

最新更新