我想执行Bash中长时间运行的命令,都捕获它的退出状态,并且发球它的输出.
所以我这样做:
command | tee out.txt
ST=$?
Run Code Online (Sandbox Code Playgroud)
问题是变量ST捕获退出状态tee而不是命令.我怎么解决这个问题?
请注意,命令长时间运行并将输出重定向到文件以便以后查看它对我来说不是一个好的解决方案.
是否有"tee"的替代方法,它捕获正在执行的命令的STDOUT/STDERR,并以与处理的命令相同的退出状态退出.如下:
eet -a some.log -- mycommand --foo --bar
Run Code Online (Sandbox Code Playgroud)
其中"eet"是"tee":)的假想替代品(-a表示追加, - 分隔捕获的命令)不应该很难破解这样的命令但是它可能已经存在并且我不知道它?
谢谢.
我想将一系列命令的结果发送给变量:
variable=$(a | few | commands)
Run Code Online (Sandbox Code Playgroud)
但是,命令替换重置PIPESTATUS,所以我无法检查事后的错误.一种解决方案是mktemp暂时使用并将结果放在那里:
variable_file=$(mktemp) || exit 1
a | few | commands > $variable_file
exit_codes="${PIPESTATUS[*]}"
variable=$(<$variable_file)
Run Code Online (Sandbox Code Playgroud)
有更优雅的解决方案吗?
重复构建项目时,如果翻译单元中存在警告但没有错误,则通常不会重新编译主源文件.
这可能使得难以通过错误和警告来尝试在没有警告的情况下构建项目.通常,必须保持迭代构建直到所有错误都得到处理,然后进行全面清理并构建以确保没有警告(以及确保先前完成的构建不是由剩余引起的"侥幸"构建工件).
是否有任何方法使用CMake(或其他一些实用程序,如Bash脚本)来解析警告的构建输出,将它们保存在某个文本文件中,然后在后续构建中重新显示它们?
对于奖励积分,因为我正在为我的编译器输出着色,是否可以使用颜色控制字符保存警告并使用相同的颜色重新显示?
(如果重要的是,目前我只编译C++,而且我通常使用GCC这样做.我选择的构建生成器是Ninja,我有一些我编写的Bash脚本将我的所有调用都包含在内CMake和Ninja.)