シェルに依存しないスクリプトを書くには?ksh
、sh
およびで実行されているスクリプトを実行できるようにしたいですbash
。
たとえば、スクリプトにonの代わりwhence ls
に実行される行がある場合は、次のような内容があります。ksh
sh
if (ksh)
then whence ls
if (sh)
then whereis ls
値を使用できますか$SHELL
?それとも別の方法がありますか?
答え1
Unixシェルスクリプトで一般的に見られるパターンの1つは、共通関数(たとえば)と呼ばれる実行可能ファイルの変数を使用することです$ECHO
。その後、何を設定するかを決定する1つまたは2つの最上位関数があります$ECHO
。
一度設定すると、$ECHO
コード全体に次のものが表示されます。
$ECHO "hi"
これにより、スクリプトの機能とはまったく関係がなく、スクリプトが使用するプラットフォームインタプリタだけを使用する多数の if..then..else ブロックをコードに追加する必要がなくなります。
したがって、実行中のインタプリタ/プラットフォームに基づいて交換したい重要なプログラムに対して同じことを行うことができます。
if (ksh)
then
ECHO=echo1
FILEFIND=whence
else if (sh)
ECHO=echo2
FILEFIND=whereis
else
ECHO=echo3
FILEFIND=which
fi
これをする必要がありますか?
スクリプトを移植可能にし、インタプリタや実行可能ファイルの可用性を考慮すると、最も低い共通分母、つまり/bin/sh
。
Oracleと他の企業がどのようにこれを行うかを見てください。通常使用するインストーラを提供します/bin/sh
。これは、Solaris、AIX、Linux などのさまざまな Unix サポートを開始する際の最も一般的な分母です。
Novellが書いた後、タイトルのガイドをチェックしてください。スクリプトを移植可能にする。さまざまなシェルの系譜とその一部の共通コマンドセットを扱い、微妙な部分を処理する方法のヒントを提供します。
答え2
次のように別のシェルプロセスを起動してこれを行う必要があります。
if [ -x /bin/ksh ]
then
output=`/bin/ksh whence ls`
fi
if [ -x /bin/sh ]
then
output=`/bin/sh which ls`
fi