複数のシェルでスクリプトを実行していますか?

複数のシェルでスクリプトを実行していますか?

2つのサーバーがあります。 1つはデフォルトのシェルkshを持つAIX、もう1つはデフォルトのシェルbashを持つRHELです。

同様のコマンドを実行しましたが、AIXまたはLinux用にスクリプトをインストールしました。スクリプトはbashサーバー上で実行されません。 bashとkshでスクリプトを実行する方法はありますか、それとも2つの異なるスクリプトを生成するための最良のオプションはありますか?

#!/usr/bin/ksh
export OS=`uname -s`
echo "OS is "$OS"."
case $OS in
        "AIX")
                #run AIX commands;;
        "Linux")
                #run Linux commands;;
        "*")
                echo "Exiting. The OS type is not found.";;
esac
echo "Done."
exit 0

修正する

私が実行する必要があるコマンドは、各サーバーのユーザーアカウント用です。アカウントのロック解除の例。 AIX /usr/bin/chuser account_locked=false $USERNAME

Linux /usr/bin/passwd -u $ユーザー名

さらなる調査により、AIX のシェル位置は /usr/bin/sh にあり、Redhat のシェル位置は /bin/sh にあることがわかりました。

"uname"の結果に基づいてshebangを定義できますか?

ベストアンサー1

最も簡単な方法は、両方のシステムで同じシェルを使用することです。シェルがプリインストールされて提供されるからといって(スクリプトに対する「デフォルトシェル」のようなものはなく、シェルは shebang 行で言う通りである)他のシェルをインストールできないという意味ではありません。 AIXにbashをインストールできます(ツールボックス、例えば)またはLinuxの場合、ksh93(配布版のパッケージマネージャを使用する:パッケージのインストールksh)。

kshを選択した場合、/usr/bin/kshAIXではksh88です。 Linuxにはksh88バージョンがなく、/usr/bin/ksh93AIXで使用可能なksh93バージョンのみがあります。

両方のシステムの同じ場所に同じシェルをインストールすると(シンボリックリンクが可能です)、shebang行で同じパスを使用できる場合は簡単になります。同じ場所を持つのが難しい場合は、両方のシステムにいることを#!/usr/bin/env bash確認する限り、同様のものを使用できます。これはrootアクセス権がないため、ホームディレクトリにbashまたはkshをインストールする必要がある場合に便利です。bashPATH

実際には、両方のシステムに同じシェルをインストールできない場合(おそらく人々の生活を複雑にしますが、反転するには根強い愚かなコンプライアンスルールがあるため)、いくつかの可能性があります。

  • #!/bin/shシステムが提供するクロスワイヤーおよびプログラムとして使用してください。すべての最新のUNIXシステムは、以下を提供します。POSIXシェルのように/bin/sh。 AIXでは/bin/shksh88です。 Red Hatでは/bin/shbashです(呼び出すと少し違うように動作しますsh)。他のオペレーティングシステム(たとえば、多くのLinuxディストリビューション)は、/bin/shPOSIXよりも多くの機能を持っていない可能性がある小さなシェルです。
  • より良いシェルを見つけて、実行するいくつかの定型句コードでスクリプトを起動します。

    #!/bin/sh
    if [ -n "$BASH" ]; then
      … bash compatibility code …
    elif type whence >/dev/null 2>/dev/null; then
      … ksh compatibility code …
    elif type ksh93 >/dev/null 2>/dev/null; then
      exec ksh93 "$0" "$@"
    elif type ksh >/dev/null 2>/dev/null; then
      exec ksh "$0" "$@"
    elif type mksh >/dev/null 2>/dev/null; then
      exec mksh "$0" "$@"
    elif type bash >/dev/null 2>/dev/null; then
      exec bash "$0" "$@"
    else
      echo 1>&2 "Cannot find ksh or bash, aborting"
      exit 125
    fi
    

どちらの場合も、ksh88とbashの交差点はPOSIX以上の便利な機能を提供しますが、いくつかの互換性コードが必要な場合があります。特に:

  • ksh88での配列割り当ての使用をset -A参照してください。各種ksh環境の代入変数
  • ローカル変数はとして宣言されますtypeset
  • Ksh88いいえ${VAR/PATTERN/REPLACEMENT}$'…'またはFIGNORE。はい[[ … ]]
  • @(…)Bashでkshおよびその他のksh拡張モードを有効にするには、を実行しますshopt -s extglob

おすすめ記事