AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

    • 主页
    • 系统&网络
    • Ubuntu
    • Unix
    • DBA
    • Computer
    • Coding
    • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 59262
Accepted
kolypto
kolypto
Asked: 2009-08-27 13:10:43 +0800 CST2009-08-27 13:10:43 +0800 CST 2009-08-27 13:10:43 +0800 CST

bash:以红色打印标准错误

  • 772

有没有办法让 bash以红色显示标准错误消息?

bash
  • 11 11 个回答
  • 61526 Views

11 个回答

  • Voted
  1. killdash9
    2013-04-24T12:53:12+08:002013-04-24T12:53:12+08:00

    方法一:直接使用进程替换:

    command 2> >(sed $'s,.*,\e[31m&\e[m,'>&2)
    

    方法 2:在 bash 或 zsh 中创建一个函数:

    color()(set -o pipefail;"$@" 2> >(sed $'s,.*,\e[31m&\e[m,'>&2))
    

    像这样使用它:

    $ color command
    

    两种方法都会stderr以红色显示命令。

    继续阅读以了解其工作原理。这些命令展示了一些有趣的特性。前 3 个要点仅适用于方法 2。其余的适用于两种方法。

    • color()...— 创建一个名为 color 的 bash 函数。
    • set -o pipefail— 这是一个 shell 选项,它保留一个命令的错误返回码,该命令的输出通过管道传输到另一个命令中。这是在由括号创建的子shell中完成的,以免更改外壳中的 pipefail 选项。
    • "$@"— 将函数的参数作为新命令执行。 "$@"相当于"$1" "$2" ...
    • 2> >(...)— 该>(...)语法称为进程替换。前面是2> ,它将stderr主命令的 连接到括号内stdin的进程的 。sed
    • sed ...— 由于上面的重定向,sed'sstdin是stderr执行命令的。它的功能是用颜色代码包围每一行。
    • $'...'一个 bash 构造,使其能够理解反斜杠转义字符
    • .*— 匹配整行。
    • \e[31m— 导致以下字符变为红色的 ANSI 转义序列
    • &—sed扩展为整个匹配字符串(本例中为整行)的替换字符。
    • \e[m— 重置颜色的 ANSI 转义序列。
    • >&2— 的简写1>&2,这会将sed'重定向stdout到stderr。
    • 123
  2. Best Answer
    Balázs Pozsár
    2009-08-27T13:39:37+08:002009-08-27T13:39:37+08:00
    command 2> >(while read line; do echo -e "\e[01;31m$line\e[0m" >&2; done)
    
    • 118
  3. sickill
    2011-12-14T13:40:19+08:002011-12-14T13:40:19+08:00

    您还可以查看标准错误:https ://github.com/sickill/stderred

    • 30
  4. gospes
    2014-01-30T00:49:12+08:002014-01-30T00:49:12+08:00

    使stderr永久变红的 bash 方法是使用 'exec' 来重定向流。将以下内容添加到您的 bashrc:

    exec 9>&2
    exec 8> >(
        while IFS='' read -r line || [ -n "$line" ]; do
           echo -e "\033[31m${line}\033[0m"
        done
    )
    function undirect(){ exec 2>&9; }
    function redirect(){ exec 2>&8; }
    trap "redirect;" DEBUG
    PROMPT_COMMAND='undirect;'
    

    我之前已经发布过:如何为 STDOUT 和 STDERR 设置字体颜色

    • 20
  5. quaie
    2009-08-27T13:18:59+08:002009-08-27T13:18:59+08:00

    http://sourceforge.net/projects/hilite/

    • 14
  6. kolypto
    2009-08-27T14:13:29+08:002009-08-27T14:13:29+08:00

    我制作了一个包装脚本,以纯 bash 实现 Balázs Pozsár 的答案。将其保存在您的 $PATH 和前缀命令中以对其输出进行着色。

        #!/bin/bash
    
        如果 [ $1 == "--help" ] ; 然后
            echo "执行命令并对发生的所有错误进行着色"
            echo "示例:`basename ${0}` wget ..."
            回声“(c)o_O Tync,ICQ#1227-700,享受!”
            出口 0
            菲
    
        # 临时文件捕获所有错误
        TMP_ERRS=$(mktemp)
    
        # 执行命令
        "$@" 2> >(读取行时;执行 echo -e "\e[01;31m$line\e[0m" | tee --append $TMP_ERRS;完成)
        EXIT_CODE=$?
    
        # 再次显示所有错误
        如果 [ -s "$TMP_ERRS" ] ; 然后
            echo -e "\n\n\n\e[01;31m === 错误 === \e[0m"
            猫 $TMP_ERRS
            菲
        rm -f $TMP_ERRS
    
        # 结束
        退出 $EXIT_CODE
    
    
    • 7
  7. Ali Mezgani
    2009-08-27T14:29:58+08:002009-08-27T14:29:58+08:00

    您可以使用这样的功能

    
     #!/bin/sh

    color() {
          printf '\033[%sm%s\033[m\n' "$@"
          # usage color "31;5" "string"
          # 0 default
          # 5 blink, 1 strong, 4 underlined
          # fg: 31 red,  32 green, 33 yellow, 34 blue, 35 purple, 36 cyan, 37 white
          # bg: 40 black, 41 red, 44 blue, 45 purple
          }
    string="Hello world!"
    color '31;1' "$string" >&2
    

    我附加 >&2 以打印到 stderr

    • 3
  8. Cliff
    2012-06-09T09:37:56+08:002012-06-09T09:37:56+08:00

    我有一个稍微修改过的 O_o Tync 脚本版本。我需要为 OS X Lion 制作这些模组,但它并不完美,因为脚本有时会在包装命令之前完成。我已经添加了睡眠,但我确信有更好的方法。

    #!/bin/bash
    
       if [ $1 == "--help" ] ; then
           echo "Executes a command and colorizes all errors occured"
           echo "Example: `basename ${0}` wget ..."
           echo "(c) o_O Tync, ICQ# 1227-700, Enjoy!"
           exit 0
           fi
    
       # Temp file to catch all errors
       TMP_ERRS=`mktemp /tmp/temperr.XXXXXX` || exit 1
    
       # Execute command
       "$@" 2> >(while read line; do echo -e "$(tput setaf 1)$line\n" | tee -a $TMP_ERRS; done)
       EXIT_CODE=$?
    
       sleep 1
       # Display all errors again
       if [ -s "$TMP_ERRS" ] ; then
           echo -e "\n\n\n$(tput setaf 1) === ERRORS === "
           cat $TMP_ERRS
       else
           echo "No errors collected in $TMP_ERRS"
       fi
       rm -f $TMP_ERRS
    
       # Finish
       exit $EXIT_CODE
    
    • 1
  9. Eyal Levin
    2016-08-26T01:16:17+08:002016-08-26T01:16:17+08:00

    这个解决方案对我有用:https ://superuser.com/questions/28869/immediately-tell-which-output-was-sent-to-stderr

    我已将此功能放在我的.bashrcor中.zshrc:

    # Red STDERR
    # rse <command string>
    function rse()
    {
        # We need to wrap each phrase of the command in quotes to preserve arguments that contain whitespace
        # Execute the command, swap STDOUT and STDERR, colour STDOUT, swap back
        ((eval $(for phrase in "$@"; do echo -n "'$phrase' "; done)) 3>&1 1>&2 2>&3 | sed -e "s/^\(.*\)$/$(echo -en \\033)[31;1m\1$(echo -en \\033)[0m/") 3>&1 1>&2 2>&3
    }
    

    然后例如:

    $ rse cat non_existing_file.txt
    

    会给我一个红色的输出。

    • 1
  10. Carlos Barcellos
    2018-08-24T05:37:03+08:002018-08-24T05:37:03+08:00

    使用 xargs 和 printf:

    command 2> >(xargs -0 printf "\e[31m%s\e[m" >&2)
    
    • 1

相关问题

  • Mac OS X:从 python 脚本中更改 $PATH

  • Bash 脚本:要求脚本以 root 身份运行(或使用 sudo)

  • crontab ifconfig 什么都不输出

  • 使用命令行工具按排序顺序计算重复项

  • 是否有 bash 等效于 ruby​​ 的“一些内容#{foo}”?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助
subwaysurfers
my femboy roommate

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve