.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です。!
brew
test
!
- 検索パスにない場合、
brew
出力はwhich brew
空であるため、test
コマンドは単一の引数を受け取る!
のでtest
trueを返します。
パスに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