2017-01-13 2 views
0

私はbashスクリプトコードを見ていると、時々|と表示されることがありますが、どちらが良いか分かりません。bashどのOR演算子を使うか - pipe v double pipe

私のような何かをしようとしている。..

set -e; 

ret=0 && { which ansible || ret=$?; } 

if [[ ${ret} -ne 0 ]]; then 
    # install ansible here 
fi 

は、このシナリオで好まれているOR演算子お知らせください。

+4

これらは全く異なることを意味します。 |配管データです。 ||またはである。 – ceejayoz

+0

'set e'は何をすべきでしょうか? – melpomene

+0

https://www.gnu.org/software/bash/manual/bashref.html – melpomene

答えて

5

|はOR演算子ではありません。あなたしかし、||を使用することができます。

which ansible || { 
    true # put your code to install ansible here 
} 

をこれはifと同等です:

if ! which ansible; then 
    true # put your code to install ansible here 
fi 

ところで - type(シェル組み込み)を使用しての習慣にすることを検討しますwhich(外部コマンド)ではなくtypeはより速く、シェルの動作をよりよく理解しています。たとえば、whichは実際のコマンドを呼び出すシェル関数によって提供されるansibleコマンドを持っていれば、そこにあることはわかりません。typeは、 。

+0

偽のbashマニュアルには、 'OR '演算子があると言われていますが、文字列比較演算子として使用されている方法では100%です。 http://www.tldp.org/LDP/abs/html/ops.html –

+1

@ l'L'l、...私にABSを引用しないでください。 *本物の*リファレンス(公式マニュアル、bash-hackers wikiなど)を見つけてください。 –

+0

これは無効ですか?私はそれを知らなかった。 –

1

単一のパイプ(1つのコマンドからのパイプ出力を次のコマンドの入力として使用する)とプロセス制御OR(2重パイプ)を使用することには大きな違いがあります。

cat /etc/issue | less 

これは、/ etc/issueファイルにcatコマンドを実行し、代わりにすぐに以下のコマンドのために入力されるようにパイプされ、出力をstdoutに送信します。しかし、少なくともあなたはそれがこの1のために

touch /etc/testing || echo Did not work 

をどのように機能するかを見ることができ、タッチコマンドを実行するか、試行さ - はい、これはあなたの代わりに、単純に以下の/ etc /発行を行う可能性があるので、良い例ではありません走る。終了ステータスが0以外の場合、ダブルパイプORが起動し、echoコマンドを実行しようとします。タッチコマンドがうまくいけば、他の選択肢(この場合はエコーコマンド)は決して試行されません。