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
をご覧ください。 さまざまなソフトウェアのスクリプト。