我有一个 bash 脚本,它设置一些环境参数,然后运行 C++ 应用程序。
C++ 应用程序在运行时输出显示其当前状态的信息。
目前,我只有在运行完成后才能看到结果。 (大约 1 分钟)是否有办法让 bash 脚本显示应用程序的实时输出?
这是我到目前为止所拥有的:
OUTPUT="$(sudo ./test_app -release)"
echo $OUTPUT
申请完成后我会得到以下信息:
release acknowledgereleasingstage1stage2released
如果我直接从命令行运行应用程序,则每个进程完成时我都会将其作为新行,而不是应用程序完成时全部合并在一起。
release acknowledge
releasing
stage1
stage2
released
有什么想法如何做到这一点?我想从 bash 脚本调用该应用程序,以避免用户必须运行多个命令。
谢谢。
答案1
如果你想显示输出并且不需要保存它,只需运行命令:
sudo ./test_app -release
如果您想保存输出并显示它,请调用tee
复制输出。
OUTPUT=$(sudo ./test_app -release | tee /dev/stderr)
当您重定向输出时,应用程序可能会缓冲它以大块的形式输出,而不是逐行输出。仅当输出是终端时,逐行才是默认设置,而不是当输出是管道或常规文件时。如果您的申请属于这种情况,致电unbuffer
或stdbuff
。由于他们的工作方式,stdbuf
需要通过 sudo 调用,而buffer
可以像你一样运行。
OUTPUT=$(sudo stdbuf ./test_app -release | tee /dev/stderr)
OUTPUT=$(unbuffer sudo ./test_app -release | tee /dev/stderr)
答案2
假设您不需要出于任何特定原因存储输出,您可以简单地替换,
OUTPUT="$(sudo ./test_app -release)"
echo $OUTPUT
和
sudo ./test_app -release
内置命令和非内置命令(在基本级别)之间的 shell 脚本没有特殊区别。他们都只是执行和输出东西。