【问题标题】:How to handle error when exit code is zero in bashbash中退出代码为零时如何处理错误
【发布时间】:2012-12-18 05:59:04
【问题描述】:

我有以下脚本~/bin/cat,它使用pygmentize 来显示语法高亮文件,如果不只是普通的旧cat

#!/bin/bash

for var; do 
    pygmentize "$var" 2> /dev/null

    if [ $? -ne 0 ]; then 
        /bin/cat "$var"
    fi
done

这在我的工作机器上运行良好,但在我的家用机器上却不行。在家里,如果pygmentize 无法识别文件,它会显示相同的错误消息,但退出状态为 0,而在工作时它返回 1,这会破坏脚本。唯一的区别是我在工作中运行 Fedora 和在家里运行 Ubuntu。

$ pygmentize testfile
Error: no lexer for filename 'testfile' found

$ echo $?
0

$ file testfile
file: ASCII text

这很奇怪,因为它们是相同的版本

$ pygmentize -V
Pygments version 1.4, (c) 2006-2008 by Georg Brandl.

我可以在stderr 中为Error 提供grep,但我如何在不丢弃stdout 的情况下做到这一点,我应该如何处理?

【问题讨论】:

  • 查看两个发行版都应用的补丁,找出修复/破坏它的补丁。

标签: bash shell colors terminal pygments


【解决方案1】:

好吧,您最好的方法是修复 pygmentize 以正确返回错误代码。正如 Ignacio Vazquez-Abrams 所提到的,其中一个发行版有一个补丁可以导致或修复此问题。

但是,解决方法如下:

如果错误信息在 stderr 上

最简单的方法可能是将 stderr 重定向到一个临时文件,然后不理会 stdout:

pygmentize "$var" 2> "$tmpfile"

然后你可以 grep "$tmpfile"。还有其他方法,但它们是more complicated

如果错误信息在标准输出上

是的,那将是 pygmentize 中的另一个错误,它应该在 stderr 上。但是,临时文件将再次起作用。只需cat 将临时文件返回到标准输出(如果可以的话)。或者,您可以使用tee 将标准输出复制到多个目标。

【讨论】:

  • 错误消息至少在stderr 上,但我真的不想每次都创建 tmp 文件。我想我应该考虑修复 pygmentize 而不是解决方法。
  • @sudo_O 好吧,检查“更复杂”的链接...您可以执行整个重定向序列并避免临时文件。但是,是的,真的,你应该修复程序。请在找到修复程序后向 Ubuntu 提交补丁,以便其他人也能从中受益。
猜你喜欢
  • 2018-09-05
  • 1970-01-01
  • 2022-11-04
  • 2019-11-23
  • 1970-01-01
  • 2017-01-08
  • 2019-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多