GNU/Linux >> Linux の 問題 >  >> Linux

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

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

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

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

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

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

承認された回答:

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

which 標準ではなく、実際には信頼性がありません。 type 推奨される代替手段です。 whereis whichと同じ問題が発生します あまり一般的ではありません。 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などのエキゾチックなものはオプションです)。バージョン3のほとんども信頼できますが、これはまだ完全に実装されているわけではありません。バージョン4のサポートは大雑把です。これらの仕様を読む場合は、バージョン3を読むことをお勧めします。バージョン3は、バージョン2よりもはるかに読みやすく、曖昧さが少なくなっています。

関連:標準ツールを使用してディスク全体のパーティションレイアウトをコピーするにはどうすればよいですか?

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


Linux
  1. bashスクリプトが同時に実行されないようにする

  2. シェルがSshから制御されているかどうかを検出する方法は?

  3. フォルダから最も古いファイルを削除するためのBashスクリプト?

  1. サービスがスクリプトで実行されているかどうかをテストする「適切な」方法は?

  2. スクリプトからキーが押されたかどうかを検出しますか?

  3. バックアップするファイルシステムはどれが最適ですか?

  1. シェルコマンド出力からすべてのSlurmジョブをキャンセルする最良の方法は?

  2. PC用の5つの最高のクロスプラットフォームチームチャットソフトウェア

  3. Bashスクリプトでクリップボードとの間でパイプする