which
以前は、さまざまなプラットフォーム(LinuxとSolaris vx. OS X)でコマンドの出力が異なり、イライラして、他のシェルもこの問題に影響を与える可能性があります。type
より良い選択肢として提案されましたが、移植性はどのくらいですか?
過去には、出力を解析し、which
私が遭遇したさまざまなユースケースを処理する関数を作成しました。それらは私が使用しているコンピュータで動作するため、私の個人的なスクリプトには問題ありませんが、他の人が使用できるように他の場所に公開するソフトウェアの場合は非常に不安定に見えます。
可能な例を挙げるには、bashとzshがマシンで利用可能かどうかをスクリプトで検出し、zshがある場合はzshを使用し、zshがなく、bashだけで十分な場合はbashを使用してコマンドを実行する必要があるとします。バージョン固有のバグはありません。残りのスクリプトの多くはBourne ShellやRubyなどですが、この特定の作業はzshまたは最新バージョンのbash(私が知っている限り)を使用して実行する必要があります。
type
クロスプラットフォームの可用性を期待できますか?which
特定のソフトウェアをインストールするかどうかについての質問に簡単かつ一貫して答えるための選択肢はありますか?
(私が提示した例と具体的に関連する考えを提供したい場合は大丈夫ですが、ほとんどの一般的な質問です。特定のコンピュータに特定の項目がインストールされていることを確認する最も信頼できる方法は何ですか?)
答え1
21世紀には、特にターゲットマシンにbashやzshがある場合は大丈夫ですtype
。 (1970年代や1980年代初めのように、非常に古いユニックスには存在しませんでした。)出力は何も意味がないとは思えませんが、その名前のコマンドがあれば0を返し、そうでなければ0ではないと予想することができます。
which
標準ではありません。実際には信頼できない。type
推奨される選択肢です。whereis
同じ問題が発生しましたが、あまりwhich
一般的ではありません。whence
kshとzshに固有のものです。
可能であれば、コマンドが存在するかどうかをテストし、コマンドの動作が合理的であるかどうかをテストする方が安定します。たとえば、次のコマンドを実行して、適切なバージョンのbashが存在するかどうかをテストしますbash -c 'somecommand'
。
# Test for the `-v` operator (which appeared in bash 4.2)
if bash -c 'test -v HOME' 2>/dev/null; then …
今日、あなたはほぼすべてを信じることができますシングルUNIX仕様バージョン2(とにかく、オプションのFortranやSCCSなどの外来種を除く)。最も信頼できる。バージョン3これも事実ですが、まだどこでも完全に実装されていません。バージョン4サポートはおおよそのです。この仕様を読みたい場合は、バージョン2よりも読みやすく、明確なバージョン3を読むことをお勧めします。
システム特性を検出する方法の例については、次を参照してください。自動設定configure
さまざまなソフトウェアのスクリプト。
また、見ることができますポータブルシェルプログラミングリソースより多くのヒントをご覧ください。