さまざまな*nixバージョン(red hat linux、hp ux、Solaris)で実行するように更新する必要があるkshスクリプトとcshスクリプトがたくさんあります。シェルは各サーバーにローカルにインストールされるため、各環境で機能する必要があります。
Linuxで特定のコマンドを見つけることができないという問題があります。たとえば、スクリプトを使用する場合、nawk
Linuxではをに置き換える必要がありますgawk
。
/usr/xpg4/bin/grep
Solarisではgrep
-q(quiet)オプションは使用できませんが、Linux上のgrepはこの環境に存在する場合と存在しないため、スクリプトも使用されます/usr/xpg4/bin/grep
。
すべてのスクリプトに触れたくないので、より包括的なソリューションを探しています。
エイリアスを設定しようとしましたが、うまくいきます。ただし、対話型モードでのみ可能です。スクリプトにエイリアスを使用することはお勧めできません。
システムディレクトリにシンボリックリンクを追加できますが、この「最も」設定を管理するには管理者権限が必要であり、設定は移植できなくなります。
私はシステム管理に精通していないので、これらのニーズに合った標準的な解決策はないかもしれません。
書き換えることなく移植可能なスクリプトを持つにはどうすればよいですか?
答え1
POSIX
正しいアプローチは、互換性のあるコマンド(たとえば、awk
notnawk
またはgawk
、、grep
notを使用)、オプション、および構文に固執し、次のよう/usr/xpg4/bin/grep
に設定することです。PATH
PATH=$(getconf PATH):$PATH
またはSolaris(以前のBourneシェルを使用している場合):
PATH=`getconf PATH`:$PATH
それがすべてです。ここで始まるスクリプトは変更されずに実行する必要があります。しかし、#!/bin/sh
一般的な信念にもかかわらず、shebangを使用しないでください。いいえ POSIX
遵守する。 Shebangをまったく使用しないでください。コンピュータがどのシェルを使用できるかをcommand -v sh
確認するために使用できます。POSIX
しかし、移植不可能なスクリプトを変更せずに維持したいようです。その後、構文を使用して以前に提案されたコマンドアプローチを維持し、POSIX
フロントエンドを追加して他のオペレーティングシステムから移植できないコマンドを処理できます。スクリプトはBourneまたはCshスタイルのシェルを使用しているため、エイリアスと関数は移植可能ではないため、独自のラッパースクリプトライブラリを使用してPATH
。
sh/ksh/bash/...:
PATH=~/bin:`getconf PATH`:$PATH
コマンドライン:
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つだけですが、すべてのホストで機能します。