5

スクリプトがあります。bash の連想配列を使用する必要があります (これについては私を信頼してください)。

通常のマシンと、/bin/bash 3.2 を持つ特定の追加マシンで実行する必要があります。

インタープリターを、そこに置いたbash 4.2の場所であると宣言すると正常に動作し/opt/userwriteablefolder/bin/bash4ます..しかし、それはそのマシンでのみ動作します。

スクリプトの冒頭で、解釈シェルが何であるかをチェックするテストを行いたいと思います。それが bash3.2 の場合は、bash4 $0 $@. 問題は、解釈しているシェルが何であるかを判断する方法がわからないことです。私は $HOSTNAME ベースの決定を行いたくないのですが、必要に応じて機能します (「これは既に実行済みです」というフラグを渡す必要があるため、これも厄介です)。

いくつかの理由から、「スクリプトを 2 つだけ用意する」という方法は適切な解決策ではありません。

4

2 に答える 2

2

どのインタープリターが使用されている$SHELLかは、シェル実行可能ファイルへのフル パス (例: /bin/bash)を含む で確認できます。

次に、Bash の場合は、さまざまな方法で Bash のバージョンを確認できます。

  • ${BASH_VERSINFO[*]}-- バージョン コンポーネントの配列。(4 1 5 1 release x86_64-pc-linux-gnu)
  • ${BASH_VERSION}-- 文字列バージョン、例えば4.1.5(1)-release
  • そしてもちろん、"$0" --version
于 2012-07-28T00:03:44.150 に答える
2

スクリプトの起動方法によっては、これがオプションになる可能性があります。

  1. bash 4.2 を としてインストールします/opt/userwriteablefolder/bin/bash
  2. スクリプトのシバンとして「#!/usr/bin/env bash」を使用します。
  3. PATHスクリプトが呼び出される環境の先頭に「/opt/userwriteablefolder/bin」を追加して、存在する場合はbashそこが使用され、存在しない場合は通常bashが使用されるようにします。

利点は、実行時に bash のバージョンを検出する必要がなくなることですが、セットアップによってはステップ 3 が望ましくない場合があることを認識しています。

于 2012-07-28T00:21:39.677 に答える