shell 输出中的着色命令与参数

shell 输出中的着色命令与参数

使用 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}"
    )
}

使用正确的正则表达式而不是我的errorwarning、 和undefined reference,您可能可以对正在进行的输出进行相当不错的突出显示。

以下是一些细节。

  • 你必须使用\x1binsed因为它不理解\033

  • &扩展到行中匹配的部分。

  • --unbuffered这是必要的,否则一旦整个 make 命令完成,您的输出要么会以大块的形式出现,要么以单个块的形式出现。

  • command避免递归调用makeshell 函数。

  • "@"将提供给 shell 函数的参数转发makecommand make.这将包括VERBOSE=1和其他任何事情。

  • CLICOLOR_FORCE是从 CMake 生成的 Makefile 中获得彩色输出,如果输出不是 TTY(例如:管道),则通常会关闭该输出。

  • 子 shellset -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_pleaseCMAKE_COLOR_MAKEFILE

如果该项目不是您的并且CMAKE_COLOR_MAKEFILE已关闭,那么您可以在列表中添加一些替代品以进行补偿。

另请注意,这CLICOLOR_FORCE是一个由其他命令检查的变量,因此放入export CLICOLOR_FORCE=yessirshell 启动文件将影响您可能想要的更多内容。我不做。

参考CMAKE_COLOR_MAKEFILEhttps://cmake.org/cmake/help/latest/variable/CMAKE_COLOR_MAKEFILE.html

相关内容