プログラムで奇妙な味を検出する方法(例:gawk vs nawk)

プログラムで奇妙な味を検出する方法(例:gawk vs nawk)

私が使用するコマンドラインアプリケーションは、基本的にbashシェルスクリプトのコレクションです。このアプリケーションはBSD / OSXとLinuxで実行するように書かれています。スクリプトの1つはawkによって異なります。これには2つのawkコマンドが含まれています。 1つはnawk(標準BSD awk実装)用に作成され、もう1つはgawk(GNU awk実装)用に作成されました。

議論された2つのawkコマンドは、特に他の環境と互換性がありません。 nawk コマンドは、gawk とともに実行すると失敗します。スクリプトはカーネル名(例uname -s:)を調べてホスト環境を決定し、適切なawkコマンドを発行します。しかし、私はGNUコアユーティリティがインストールされているMac OS Xで作業することを好むので、スクリプトは正しく実行されません。

このバグを最もよく解決する方法を考えている間、プログラム的に共通のコマンドラインユーティリティのさまざまなバージョンを比較的強力で移植可能な方法で区別できればと思いました。

私はnawkがバージョン情報を印刷するために「-V」フラグを受け入れないことを知り、次のようなことがうまくいくはずだと思いました。

awk -V &>/dev/null && echo gawk || echo nawk

別のバリエーションは次のとおりです。

awk -Wversion &>/dev/null && echo gawk || echo nawk

これは私のテスト環境(OS XとCentOS)の両方で動作するようです。私の質問は次のとおりです。

  • これが最善の方法ですか?
  • awkの他のバリエーション(例えば、mawk、jawなど)を処理するためにそれを拡張する方法はありますか?
  • 他のバージョンのawkについて心配する価値はありますか?

また、私はawkについてほとんど知らないことを言及したいと思います。

ベストアンサー1

if awk --version 2>&1 | grep -q "GNU Awk"
then
    awk 'BEGIN {print "I am GNU Awk"}'

elif awk -Wv 2>&1 | grep -q "mawk"
then
    awk 'BEGIN {print "I am mawk"}'

else
    awk 'BEGIN {print "I might be nawk, might not be"}'
fi

または test is awk はシンボリックリンクです。

awk=$( command -v awk )
[[ -L $awk ]] && readlink $awk # make some decision about the result of that

おすすめ記事