「テスト」と/ dev / nullを使用した評価の違いは何ですか?

「テスト」と/ dev / nullを使用した評価の違いは何ですか?

.shホームブレイクにはインストールの有無を確認する他のスクリプトがあることがわかりました。

次の構文を使用してください。

if test ! $(which brew); then

もう一つは、次の構文を使用します。

if ! which brew > /dev/null; then

どちらも終了コードを確認することを知っていますが、which brew両者に異なる違いがあるかどうか疑問に思います。私にとっては、電子がよりきれいで出力をリダイレクトする必要がないので(おそらく間違って)、より効率的だと思います。

which brewまた、出力が送信されているかどうかに関係なく、2番目の項目が実際に実行されるのはなぜですか/dev/null?シェルはどのように機能しますか?

ベストアンサー1

1つ目は不器用なハッキングで、2つ目はよく犯される間違いです。

これら2つのテストはまったく異なる操作を実行しますが、同じ結果を生成します。

if test ! $(which brew); then

これにより、次のようなテストが行​​われます。出力空だったwhich brew

  • brew検索パスにある場合はwhich brew出力ワードが生成されるため、コマンドは2つの引数pathをtest受け取ります。 2つのパラメータがある場合、2番目のパラメータが空の場合(ここではそうではありません)、最初のパラメータはtrue、そうでない場合はfalseです。!brewtest!
  • 検索パスにない場合、brew出力はwhich brew空であるため、testコマンドは単一の引数を受け取る!のでtesttrueを返します。

パスにbrewスペースが含まれている場合、このコマンドはエラーメッセージと失敗ステータスを生成します。これは引用符なしのコマンド置換の意味です。。ここでは失敗状態が望む結果なので、これをバイパスする方法です。

このコマンドは終了コードをテストしませんwhich brew。終了コードは無視されます。

if ! which brew > /dev/null; then

これはwhich brew成功をテストする簡単な方法です。それは壊れやすいものには依存せず、それ自体に依存しますwhich

which brewどちらの場合も常に呼び出されます。出力にリダイレクトすることが重要な理由は何ですか/dev/null? 「このコマンドの出力を隠す」とは、「このコマンドを実行しない」という意味ではありません。

brew検索パスでコマンドが使用できないことをテストする正しい方法は次のとおりです。

if ! type brew >/dev/null 2>/dev/null; then

バラより「which」を使わないのはなぜですか?それでは何を使うべきですか?

おすすめ記事