-->

2009-12-20

manのエラーメッセージの日本語をutf8に変更する。

この記事は LANG, LC_ALL が utf8 の環境で man が nls を use に持つ場合 man, man -h が eucjp で表示されるので文字化けする場合の設定例です。

$ cat /usr/local/bin/man
#!/bin/sh
# http://www.netfort.gr.jp/~tomokuni/lms/shell/text/shell3.txt
# 1.2  標準エラー出力のみをパイプ => (例 3) => を適用

BUF="`/usr/bin/man $@ 3>&1 1>&2 2>&3 3>&-`"
RET="$?"
if [ -n "$BUF" ]; then
    echo "$BUF" | nkf 1>&2
    if [ "$RET" -eq 0 ]; then
 echo
    fi
fi
exit "$RET"

以前修正したところ、Xの環境の場合にエラーが出るので man に -nls をつけていたのだが、再度 man に nls をつけて試したところ、エラーが出なくなっていました。
nkf が更新されたためだと思われます。
$ eix ^nkf$
[I] app-i18n/nkf
     Available versions:  2.0.7 ~2.0.7-r1 {linguas_ja perl python}
     Installed versions:  2.0.7(10時47分42秒 2009年11月29日)(linguas_ja perl python)
     Homepage:            http://sourceforge.jp/projects/nkf/
     Description:         Network Kanji code conversion Filter with UTF-8/16 support

また distcc を使う際 native を使うと emerge は off にしますが、それを回避するためのコマンドの例です。
http://d.hatena.ne.jp/tmatsuu/20090110/1231557035
$ cat /usr/local/bin/gcc-opt
#!/bin/sh

CC="gcc"
OPT="-march=native -O2 -pipe -fomit-frame-pointer"

TMP=$@
if [ "$TMP" != "" ]; then
    OPT=$TMP
fi

NATIVE=$(echo | ${CC} -E -v ${OPT} - 2>&1 | grep cc1)
NOARCH=$(echo | ${CC} -E -v - 2>&1 | grep cc1)

for native in ${NATIVE} ; do
    FOUND=0
    for noarch in ${NOARCH} ; do
        if [ "${native}" = "${noarch}" -a "${native}" != "${OPT}" ] ; then
            FOUND=1
            break
        fi
    done
    if [ ${FOUND} -eq 0 ] ; then
        echo -n "${native} "
    fi
done
echo

英語のmanのコマンドを追加します。
alias enman='LANG=C LC_ALL=C man'


追記: /usr/local/bin/man が必要な環境は下記になります。

lzmaは無くてもいいです。nlsがあると man, man -h がeuc-jpで表示されます。
$ emerge -pv man
...
[ebuild   R   ] sys-apps/man-1.6f-r3  USE="lzma nls" 0 kB
...

euc-jpとutf8の内容を一旦euc-jpにしてgroffに渡して処理してもらい、その結果をutf8にしています。
$ diff -u /etc/man.conf.old /etc/man.conf
...
-JNROFF         /usr/bin/groff -Tnippon -mandocj
+JNROFF         nkf -e | LANG=ja_JP.EUC-JP LC_ALL=ja_JP.EUC-JP /usr/bin/groff -Tnippon -mandocj | nkf -w
...

文字コードの設定です。
$ echo $LANG $LC_ALL
ja_JP.UTF-8 ja_JP.UTF-8

エラー出力だけnkfを通したい場合に/usr/local/bin/manを利用します。
$ /usr/bin/man 2>&1 | php -r 'mb_language("ja");print mb_detect_encoding(file_get_contents("php://stdin"), "auto")."\n";'
EUC-JP
$ /usr/bin/man -h 2>&1 | php -r 'mb_language("ja");print mb_detect_encoding(file_get_contents("php://stdin"), "auto")."\n";'
EUC-JP
$ /usr/bin/man 2>&1 | nkf -w
どのマニュアルを表示しますか?
$ man
どのマニュアルを表示しますか?
$ which man
/usr/local/bin/man

つまり man関連の日本語manが必要ない場合は -nls でインストールすれば必要ないです。man, man -h のエラー出力は英語になります。
もしくは man, man -h のエラー出力が文字化けしても問題なければ必要ないです。
もしくは euc-jp の環境であれば必要ないです。JNROFFの設定は戻します。戻さずに最後の-wを-eにしてもいいかもしれません。

sys-apps/groff-1.20.1-r1 が euc-jp を処理できないかもしれません。マスクしています。
$ eix groff
[I] sys-apps/groff
     Available versions:  1.19.2-r3 ~1.20.1 [m]1.20.1-r1 ~1.20.1-r2 {X cjk examples linguas_ja}
     Installed versions:  1.19.2-r3(11時35分58秒 2009年11月29日)(X cjk)
     Homepage:            http://www.gnu.org/software/groff/groff.html
     Description:         Text formatter used for man pages
$ grep groff /etc/portage/package.mask
=sys-apps/groff-1.20.1-r1

0 件のコメント: