web-dev-qa-db-ja.com

ソフトウェアがインストールされているかどうかを(スクリプトから)検出する最良の方法は何ですか?

私は以前、さまざまなプラットフォーム(LinuxとSolarisvx。OSX)でwhichコマンドからの出力が異なり、さまざまなシェルが問題に関与している可能性があることに不満を感じていました。 typeがより良い代替手段として提案されていますが、それはどの程度移植可能でしょうか?

過去に、whichの出力を解析し、遭遇したさまざまなユースケースを処理する関数を作成しました。それらは私が使用するマシン全体で機能するので、私の個人的なスクリプトには問題ありませんが、他の人が使用できるようにどこかに投稿するソフトウェアでは、これはひどく信頼できないようです。

考えられる例を1つだけ挙げると、マシンでbashとzshが使用可能かどうかをスクリプトから検出し、存在する場合はzshを使用して、zshが存在しない場合はbashを使用して、bashで十分なコマンドを実行する必要があるとします。特定のバグがないバージョン。スクリプトの残りのほとんどはBourneShellまたはRubyまたはその他のものである可能性がありますが、この1つの特定のことはzshまたは最近のバージョンのbashのいずれかで実行する必要があります(AFAIK)。

typeがプラットフォーム間で利用可能であることを期待できますか?特定のソフトウェアがインストールされているかどうかの質問に簡単かつ一貫して答えることができるwhichの代替手段はありますか?

(私が示した例に特に関連するアイデアも提供したい場合、それは素晴らしいことですが、私は主に一般的なケースについて質問しています:特定のものが特定のマシンにインストールされているかどうかを確認するための最も信頼できる方法は何ですか? ?)

9
iconoclast

21世紀では、特にbashまたはzshを搭載している可能性が高いマシンをターゲットにしている場合は、typeが利用可能であることを期待できます。 (1970年代や1980年代初頭のように、非常に古いユニスには存在しませんでした。)何かを意味する出力を期待することはできませんが、その名前のコマンドがあり、それ以外の場合はゼロ以外。

whichは標準ではなく、 実際には信頼できませんtypeが推奨される代替手段です。 whereiswhichと同じ問題を抱えており、あまり一般的ではありません。 whenceはkshとzshに固有です。

それが可能な場合は、コマンドの存在をテストし、その動作が妥当であるかどうかをテストする方が信頼性が高くなります。たとえば、bash -c 'somecommand'を実行して、適切なバージョンのbashの存在をテストします。

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

今日では、 Singe UNIX仕様バージョン2 のほとんどすべてを信頼できます(とにかくオプションであるFortranやSCCSなどのエキゾチックなものを除く)。 バージョン のほとんども信頼できますが、これはまだどこでも完全に実装されているわけではありません。 バージョン4 サポートは大雑把です。これらの仕様を読む場合は、バージョン2よりもはるかに読みやすく曖昧さが少ないバージョン3を読むことをお勧めします。

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

その他のヒントについては、 ポータブルシェルプログラミングのリソース も参照してください。