さまざまな *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
準拠したコマンド (つまりawk
、nawk
または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 つだけですが、すべてのホストで使用できます。