bash wrapper to color stderr red

后端 未结 2 717
谎友^
谎友^ 2021-01-20 22:48

Bash supports colors, i.e. \\033[31m switches to red and \\033[0m switches back to uncolored.

I would like to make a small bash-wrapper that re

相关标签:
2条回答
  • 2021-01-20 23:24

    Colorizing text is simple enough: read each line and echo it with appropriate escape sequences at beginning and end. But colorizing standard error gets tricky because standard error doesn’t get passed to pipes.

    Here’s one approach that works by swapping standard error and standard output, then filtering standard output.

    Here is our test command:

    #!/bin/bash
    
    echo hi
    echo 'Error!' 1>&2
    

    And the wrapper script:

    #!/bin/bash
    (# swap stderr and stdout
     exec 3>&1 # copy stdout to fd 3
     exec 1>&2 # copy stderr to fd 1
     exec 2>&3- # move saved stdout on fd 3 over to 2
     "${@}") | while read line; do
                    echo -e "\033[31m${line}\033[0m"
               done
    

    Then:

    $ ./wrapper ./test-command
    hi
    Error! # <- shows up red
    

    Unfortunately, all output from the wrapper command comes out of stderr, not stdout, so you can’t pipe the output into any further scripts. You can probably get around this by creating a temporary fifo… but hopefully this little wrapper script is enough to meet your needs.

    0 讨论(0)
  • 2021-01-20 23:34

    Based on andrewdotn's wrapper

    Changes:

    • Puts the stderr output back to stderr
    • Avoid echo -e processing content in the lines

    wrapper

    #!/bin/bash
    
    "${@}" 2> >(
    while read line; do
        echo -ne "\033[31m" 1>&2
        echo -n "${line}" 1>&2
        echo -e "\033[0m" 1>&2
    done
    )
    

    Issues: The output lines end up grouped, rather than mixed stdout/stderr

    Test script:

    #!/bin/bash
    
    echo Hi
    echo "\033[32mStuff"
    echo message
    echo error 1>&2
    echo message
    echo error 1>&2
    echo message
    echo error 1>&2
    

    Output:

    Hi
    \033[32mStuff
    message
    message
    message
    error # <- shows up red
    error # <- shows up red
    error # <- shows up red
    
    0 讨论(0)
提交回复
热议问题