
私が使用するコマンドラインアプリケーションは、基本的に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
答え2
コマンドを試しwhich
て終了コードを使用してください。
which nawk
if [[ $? == 0 ]]; then
command="nawk"
else
command="gawk"
fi
次に、変数をコマンドとして使用するスクリプト形式を指定します。
$command '{print $1}`
次のように読まれます。
nawk '{print $1}`
もしwhich
見つかったら。それ以外の場合は、次を使用します。gawk
答え3
GNU Awkは通常、デフォルトでGNUを使用するシステム上のGNUへのシンボリックリンクとしてインストールされgawk
ますawk
。私はBSDとOS Xシステムがすでに自分だけのawk
。
if gawk '{ exit; }' < /dev/null 2> /dev/null
then
echo "gawk available"
else
echo "gawk not available"
fi
答え4
autoconfのAC_PROG_AWK m4マクロを乱用して、1つを選択して適切に並べ替えることもできます。しかし、それは少し多いかもしれません。