シェルスクリプトを更新して、さまざまな *nix フレーバーで実行できるようにする必要があります

シェルスクリプトを更新して、さまざまな *nix フレーバーで実行できるようにする必要があります

さまざまな *nix フレーバー (Red Hat Linux、HP UX、Solaris) で実行できるように更新する必要がある ksh および csh スクリプトが多数あります。シェルは各サーバーのホームにマウントされており、各環境で動作させる必要があります。

Linux では見つからない特定のコマンドに問題があります。たとえば、スクリプトでは を使用しますが、 Linux ではnawkに置き換える必要があります。gawk

スクリプトでも が使用されます。/usr/xpg4/bin/grepこれは、Solaris ではgrep-q (quiet) オプションを使用できないのに対し、Linux の grep では使用でき、この環境では/usr/xpg4/bin/grep存在しないためです。

すべてのスクリプトに触れたくないので、よりグローバルなソリューションを探しています。

エイリアスを設定してみましたが、うまくいきました。ただし、対話型モードのみです。スクリプトでエイリアスを使用することは推奨されていないようです...

システム ディレクトリにシンボリック リンクを追加することはできますが、この「モック」設定を管理するには管理者権限が必要になり、設定はもはや移植可能ではありません...

私はシステム管理に慣れていないので、このようなニーズに対応する標準的なソリューションを見逃してしまう可能性があります。

すべてを書き直さずに移植可能なスクリプトを作成するにはどうすればよいでしょうか?

答え1

正しいアプローチは、POSIX準拠したコマンド (つまりawknawkまたはgawk、を使用しgrepない/usr/xpg4/bin/grep)、オプション、および構文に従い、 をPATH次のように設定することです。

PATH=$(getconf PATH):$PATH

または、Solaris で従来の Bourne シェルを使用している場合:

PATH=`getconf PATH`:$PATH

それだけです。そこで起動したスクリプトは変更せずに実行できます。#!/bin/shただし、一般に信じられているにもかかわらず、シェバンの使用は避けてください。ない POSIX準拠しています。シェバンを一切使用しないでください。マシンで使用できるシェルをcommand -v sh確認してください。POSIX

ただし、移植不可能なスクリプトは変更せずにそのままにしておきたいようです。その場合は、POSIX構文を使用するコマンドに対して以前に提案されたアプローチを維持し、移植不可能なコマンドを他の OS で処理するためのフロントエンドを追加します。スクリプトは Bourne または Csh スタイルのシェルを使用しているため、エイリアスと関数は移植不可能になります。そのため、 の前に置く独自のラッパー スクリプト ライブラリを使用する方が適切ですPATH。たとえば、次のようになります。

sh / ksh / bash / ... :

PATH=~/bin:`getconf PATH`:$PATH 

csh:

set path = ( ~/bin `getconf PATH` $path)

-

mkdir -p ~/bin
cd ~/bin
cat > awk <<%
#!/bin/sh
PATH=`getconf PATH`:$PATH awk "$@"
%
ln -s awk nawk
ln -s awk gawk

答え2

このような場合には変数を使用します

AWK=awk
GREP=grep

次にオペレーティングシステムをテストします

if [ $(uname -s) == "SunOS" ]
then
  AWK=/usr/bin/nawk
  GREP=/usr/xpg4/bin/grep
fi

(redhat、suse、hp-ux、aix についても繰り返します)

変数を後に使用

if $GREP -q whatever /some/file
then
   $AWK -F: '{....}' /some/file
fi

この方法では、スクリプトは 1 つだけですが、すべてのホストで使用できます。

関連情報