私は以前、さまざま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
さまざまなソフトウェアのスクリプトを参照してください。
その他のヒントについては、ポータブルシェルプログラミングのリソースも参照してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加