使用 make/cmake 脚本时,您通常必须使用 VERBOSE=1 并查看所有运行的命令。这是我经常做的事情,对于那些只是寻找命令起源的人来说,这完全是一种压力。
我们经常有 30 行自动换行参数,并且命令来源被混淆。
是否可以对一般命令进行着色以使其脱颖而出?我需要他们从他们的论点中脱颖而出,仅此而已。
我可以使用 bash 或 zsh 或任何支持此功能的 shell。我只需要知道一般情况下是否可以这样做。
答案1
我喜欢将“警告”和“错误”一词着色,因此我在 shell 启动文件中执行此操作
make(){
local subst
subst+="s/error/\x1b[1;31m&\x1b[0m/g; "
subst+="s/warning/\x1b[1;33m&\x1b[0m/g; "
subst+="s/undefined reference/\x1b[1;35m&\x1b[0m/g; "
# For debugging
# echo "subst = '$subst'"
(
set -o pipefail
CLICOLOR_FORCE=yes_please command make "$@" 2>&1 | sed --unbuffered "${subst}"
)
}
使用正确的正则表达式而不是我的error
、warning
、 和undefined reference
,您可能可以对正在进行的输出进行相当不错的突出显示。
以下是一些细节。
你必须使用
\x1b
insed
因为它不理解\033
。&
扩展到行中匹配的部分。--unbuffered
这是必要的,否则一旦整个 make 命令完成,您的输出要么会以大块的形式出现,要么以单个块的形式出现。command
避免递归调用make
shell 函数。"@"
将提供给 shell 函数的参数转发make
到command make
.这将包括VERBOSE=1
和其他任何事情。CLICOLOR_FORCE
是从 CMake 生成的 Makefile 中获得彩色输出,如果输出不是 TTY(例如:管道),则通常会关闭该输出。子 shell
set -o pipefail
是因为使用管道,您通常会获得管道中最后一个命令的返回码。如果所有命令都返回 0,则激活该选项pipefail
将导致管道的返回代码为 0,或者返回非零代码的最右侧命令的返回代码(即(exit 8) | true | (exit 9) | true
返回代码为 9)。之所以使用子shell,是为了set -o pipefail
不影响用户的shell。
看一下https://en.wikipedia.org/wiki/ANSI_escape_code#Colors对于颜色代码。
通常,CMake 生成的 Makefile 的输出将具有 等颜色,[ 42%] Building C object source_file.c.o
但这可以在 CMakeLists.txt 中使用 进行更改set(CMAKE_COLOR_MAKEFILE [ON|OFF])
。
如果 的输出make
不是 tty(例如),颜色也会消失。在这种情况下,您可以通过设置环境变量(或任何非空值)make | cat
强制颜色输出。但是,如果关闭,`CLICOLOR_FORCE 将不起作用。CLICOLOR_FORCE=yes_please
CMAKE_COLOR_MAKEFILE
如果该项目不是您的并且CMAKE_COLOR_MAKEFILE
已关闭,那么您可以在列表中添加一些替代品以进行补偿。
另请注意,这CLICOLOR_FORCE
是一个由其他命令检查的变量,因此放入export CLICOLOR_FORCE=yessir
shell 启动文件将影响您可能想要的更多内容。我不做。
参考CMAKE_COLOR_MAKEFILE
:https://cmake.org/cmake/help/latest/variable/CMAKE_COLOR_MAKEFILE.html