1

次のスクリプト~/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.

私は中に入ることができgrepましErrorstderrが、捨てずにこれを行うにはstdoutどうすればよいですか、これをどのように処理する必要がありますか?

4

1 に答える 1

2

さて、あなたの最善のアプローチはpygmentize、エラーコードを適切に返すように修正することです。Ignacio Vazquez-Abramsが言及しているように、ディストリビューションの1つに、これを引き起こしている、または修正しているパッチがあります。

しかし、これを回避する方法は次のとおりです。

エラーメッセージがstderrにある場合

最も簡単な方法は、おそらくstderrを一時ファイルにリダイレクトし、stdoutをそのままにしておくことです。

pygmentize "$var" 2> "$tmpfile"

次に、grepを実行できます"$tmpfile"。他の方法もありますが、もっと複雑です。

エラーメッセージがstdoutにある場合

うん、それはpygmentizeの別のバグになるだろう、それはstderrにあるはずだ。ただし、一時ファイルは再び機能します。問題がなければ、一時ファイルをstdoutcatに戻します。または、を使用teeしてstdoutを複数の宛先に複製することもできます。

于 2013-01-03T20:04:24.937 に答える