私は基本的にbashシェルスクリプトのコレクションであるコマンドラインアプリケーションを使用しています。アプリケーションは、BSD / OSXおよびLinuxで実行するように作成されました。スクリプトの1つはawkに依存しています。これには2つのawkコマンドが含まれています。1つはnawk(標準のBSD awk実装)用に記述され、もう1つはgawk(GNU awk実装)用に記述されています。
問題の2つのawkコマンドは、異なる環境との互換性がありません。特に、gawkで実行するとnawkコマンドが失敗します。スクリプトは、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
これは私の2つのテスト環境(OS XとCentOS)で動作するようです。ここに私の質問があります:
- これは最善の方法ですか?
- これを拡張してawkの他のバリエーション(例:mawk、jawkなど)を処理する方法はありますか?
- awkの他のバージョンについても心配する価値がありますか?
また、私はawkについてほとんど知らないことも述べておきます。
awk -Wv
ホスト環境の代わりにawkバージョンを見てみましょう
awk
使用されているのバージョンを無視して、代わりにPOSIX仕様にコード化することです。