1

我有以下脚本~/bin/catpygmentize如果不只是常规的 old ,则尽可能显示语法高亮文件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.

我可以进去,grep但是如何在不扔掉的情况下做到这一点,我应该如何处理?Errorstderrstdout

4

1 回答 1

2

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

但是,这里是如何解决它:

如果错误消息在 stderr

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

pygmentize "$var" 2> "$tmpfile"

然后你可以 grep "$tmpfile"。还有其他方法,但它们更复杂

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

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

于 2013-01-03T20:04:24.937 回答