ソフトウェアをインストールするかどうかをスクリプトで検出する最良の方法は何ですか?

ソフトウェアをインストールするかどうかをスクリプトで検出する最良の方法は何ですか?

which以前は、さまざまなプラットフォーム(LinuxとSolaris vx. OS X)でコマンドの出力が異なり、イライラして、他のシェルもこの問題に影響を与える可能性があります。typeより良い選択肢として提案されましたが、移植性はどのくらいですか?

過去には、出力を解析し、which私が遭遇したさまざまなユースケースを処理する関数を作成しました。それらは私が使用しているコンピュータで動作するため、私の個人的なスクリプトには問題ありませんが、他の人が使用できるように他の場所に公開するソフトウェアの場合は非常に不安定に見えます。

可能な例を挙げるには、bashとzshがマシンで利用可能かどうかをスクリプトで検出し、zshがある場合はzshを使用し、zshがなく、bashだけで十分な場合はbashを使用してコマンドを実行する必要があるとします。バージョン固有のバグはありません。残りのスクリプトの多くはBourne ShellやRubyなどですが、この特定の作業はzshまたは最新バージョンのbash(私が知っている限り)を使用して実行する必要があります。

typeクロスプラットフォームの可用性を期待できますか?which特定のソフトウェアをインストールするかどうかについての質問に簡単かつ一貫して答えるための選択肢はありますか?

(私が提示した例と具体的に関連する考えを提供したい場合は大丈夫ですが、ほとんどの一般的な質問です。特定のコンピュータに特定の項目がインストールされていることを確認する最も信頼できる方法は何ですか?)

答え1

21世紀には、特にターゲットマシンにbashやzshがある場合は大丈夫ですtype。 (1970年代や1980年代初めのように、非常に古いユニックスには存在しませんでした。)出力は何も意味がないとは思えませんが、その名前のコマンドがあれば0を返し、そうでなければ0ではないと予想することができます。

which標準ではありません。実際には信頼できないtype推奨される選択肢です。whereis同じ問題が発生しましたが、あまりwhich一般的ではありません。whencekshとzshに固有のものです。

可能であれば、コマンドが存在するかどうかをテストし、コマンドの動作が合理的であるかどうかをテストする方が安定します。たとえば、次のコマンドを実行して、適切なバージョンのbashが存在するかどうかをテストしますbash -c 'somecommand'

# Test for the `-v` operator (which appeared in bash 4.2)
if bash -c 'test -v HOME' 2>/dev/null; then …

今日、あなたはほぼすべてを信じることができますシングルUNIX仕様バージョン2(とにかく、オプションのFortranやSCCSなどの外来種を除く)。最も信頼できる。バージョン3これも事実ですが、まだどこでも完全に実装されていません。バージョン4サポートはおおよそのです。この仕様を読みたい場合は、バージョン2よりも読みやすく、明確なバージョン3を読むことをお勧めします。

システム特性を検出する方法の例については、次を参照してください。自動設定configureさまざまなソフトウェアのスクリプト。

また、見ることができますポータブルシェルプログラミングリソースより多くのヒントをご覧ください。

関連情報