2016-04-07 14 views
1

複数のテストを組み合わせたい場合、どのようにbashでテストを否定しますか?bashの論理式を否定する場所

コードが

if ! [ $(pgrep Xvfb) ] || [ ! -v DISPLAY ]; then 
    echo starting xvfb 
    mkdir -p /tmp/xvfb 
    Xvfb :1 -fbdir /tmp/xvfb > /tmp/xvfb_output 2>&1 & 
    export DISPLAY=:1 
fi 

であることを調達するために、すでに実行していない場合はXvfbのを開始することになっています。 これまでは、前記変数の存在を確認するために、|| [ ! -v DISPLAY ]部分が欠けていました。

テストを無効にするには、! [ ... ]または[ ! ... ]のいずれかを実行します。両方とも動作するようです。

[ ! ...]はテストの内側にあるため、より明確になりました(そして少し効率的です)。

答えて

1

効率性の面でネゲをどこに置いても問題ありません。

if ! (test "$(pgrep Xvfb)" -a -n "${DISPLAY:+1}"); then

使用すると、1つのテストに唯一の否定を持ってこの方法:読みやすくするためとして、あなたはこのようなあなたのif文を書くことができます。

は私が

if ! [ $(pgrep Xvfb) ] || [ ! -v DISPLAY ]; then

があいまいであることをあなたに同意し、

if [ ! $(pgrep Xvfb) ] || [ ! -v DISPLAY ]; then

ではありません。

+0

AND句として書き換えが発生していませんでした。ありがとうございました。あなたは 'もし! (test ... '行より読みやすくする行? –

+1

@userはい、私は実際に' test expr'式を '[expr]'に一般的に好んでいます。このケースは、特に、シェルスクリプトで条件の終わりを検出する手がかりとして、エンドブラケットが私の経験では決して役に立たないためです。もちろん、それは私の意見です。:-)この表記が好きな場合は、角かっこを使用します。 –

+0

'[$(pgrep Xvfb)]'は間違いです。 '[...]'テストが合格するように、 'pgrep'の出力が空でない有効な文字列になることを期待しています。しかし、それは信頼できるものでも良い考えでもありません。幸いにも(それは正常だから) 'pgrep'は意味のあるリターンコードを持っています。だから、もしあなたが '' pgrep Xvfb&>/dev/null 'のようなものを見つけたことをテストするには;エコー "私たちがXvfbを見つけたときに何かする"; fi'。この場合は 'if! pgrep Xfvb&>/dev/null || [! -v DISPLAY];それから.... fi'。また、 'DISPLAY'が設定されていない場合、Xvfbを複数回実行することに注意しましょう。 –