2008-08-22 の io.c の変更を検証する

日本の AWK ユーザのためのハブサイトの What's New に以下のように書きました。

  • CSV 版の gawk で以下の変更がありました。nextfile の挙動が環境変数で変更できるようになっています。io.c。(2008-08-23)

あまり nextfile 自体を扱うことも少ないのですが、今回の変更でどのように変わったのかを調べておきましょう。

#! /usr/bin/gawk -f
# nextfile.awk

{
    print $0;
    nextfile;
}

上のようなファイルを用意します。 さて、これは何を表しているかというと、最初の 1 行を表示するスクリプトで、ゴルフをすれば 'FNR==1' と書き表すことができます。

普通に実行してみます。 ただし、このディレクトリの中には nextfile.awk のみが配置してあり、nextfile2.awk はありません。

$ gawk -f nextfile.awk nextfile.awk nextfile2.awk
#! /usr/bin/gawk -f
gawk: nextfile.awk:7: (FILENAME=nextfile.awk FNR=1) 致命的: ファイル \
`nextfile2.awk' を読み込むために開けません (そのようなファイルやディレクトリは\
ありません)。

これは通常の場合の挙動であり、Fatal (致命的) なエラーになります。

さて、io.c の更新部分を見てみると、whiny_users というキーワードで分岐していることが分かります。 日本語だと「弱音を吐くユーザー」というところでしょうか。 彼女とは関係ありません。

少し脱線すると 10の翻訳エンジンから一括翻訳 翻訳くらべというサイトがあり、いろいろな翻訳エンジンで翻訳されたものを比較することができ、特定のエンジンで弱い翻訳を補うことができて便利です。

さて、gawk には環境変数 WHINY_USERS に 1 を入れると、少しだけ便利な挙動を示すことがあります。 実際に実行してみます。

$ WHINY_USERS=1 gawk -f nextfile.awk nextfile.awk nextfile2.awk
#! /usr/bin/gawk -f
gawk: nextfile.awk:7: (FILENAME=nextfile.awk FNR=1) 警告: ファイル \
`nextfile2.awk' を読み込むために開けません (そのようなファイルやディレクトリは\
ありません)。

先ほど Fatal だたものが、Warning (警告) に変更になりました。

つまり gawk の戻り値が変更になっているはずです。 gawk の戻り値は system() 関数を用いることで調べることができます。

$ gawk 'BEGIN{print system(" gawk -f nextfile.awk nextfile.awk nextfile2.awk")}'
#! /usr/bin/gawk -f
gawk: nextfile.awk:7: (FILENAME=nextfile.awk FNR=1) 致命的: ファイル \
`nextfile2.awk' を読み込むために開けません (そのようなファイルやディレクトリは\
ありません)。
2 # ← 戻り値は 2
$ gawk 'BEGIN{print system("env WHINY_USERS=1 gawk -f nextfile.awk nextfile.awk nextfile2.awk")}'
#! /usr/bin/gawk -f
gawk: nextfile.awk:7: (FILENAME=nextfile.awk FNR=1) 警告: ファイル \
`nextfile2.awk' を読み込むために開けません (そのようなファイルやディレクトリは\
ありません)。
0 # ← 戻り値は 0

make コマンドなどのように戻り値を気にしている場合には役に立ちそうです。

ただし、これがどのくらい有用なのかは分かりません。

tag_gawk.png