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


9

以前は、さまざまwhichなプラットフォーム(LinuxとSolaris vx。OS X)でコマンドからの出力が異なることに不満を感じていました。異なるシェルが問題に関与している可能性もあります。 typeより良い代替案として提案されてきましたが、それはどれほどポータブルですか?

過去に、which実行したさまざまなユースケースの出力を解析して処理する関数を作成しました。それらは私が使用するすべてのマシンで動作するため、私の個人用スクリプトには問題ありませんが、他のユーザーが使用するためにどこかに投稿するソフトウェアには、これは非常に信頼できないようです。

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

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

(もしあなたが私が与えた例に特に関連した考えを与えたいならそれは素晴らしいですが、私は主に一般的なケースについて尋ねています:特定のものが特定のマシンにインストールされているかどうかを調べる最も信頼できる方法は何ですか? ?)

回答:


10

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

whichは標準ではなく、実際には信頼できません。type推奨される代替手段です。whereisと同じ問題に苦しみ、whichあまり一般的ではありません。whencekshおよび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などのエキゾチックなものを除きます)。バージョン3の大部分も期待できますが、これはまだすべての場所で完全に実装されているわけではありません。バージョン4のサポートはより簡単です。これらの仕様を読む場合は、バージョン3を読むことをお勧めします。バージョン3は、バージョン2よりも読みやすく、あいまいさが少なくなります。

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

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


これは、使用して、一般的に推奨される技術上のコメントへの展開から利益を得ることができるhashcommand -v
カレブ

@Calebこの質問の目的command -vtype、overの利点はわかりません。必要なのはブール結果だけです。「を使用して一般的に推奨される手法hash」とは何ですか。
Gilles「SO-邪悪になるのをやめる」
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.