私のif文がブール値を逆に解釈するのはなぜですか?

私のif文がブール値を逆に解釈するのはなぜですか?

私の.zshrcのいくつかの機能の出力は非常に混乱しています。

function __isred {
  if [[ $(ps cax | grep redshift | wc -l) > 0 ]]
  then
    return 1
  else
    return 0
  fi
}

function __togred {
  if __isred
  then
    killall redshift
  else
    redshift &
  fi
} 

__isredのアイデアは、redshiftが実行されている場合はtrueを返し、そうでない場合はfalseを返すことです。 echo を使用して正しい出力を返すことを確認できます。しかし、出力が1の場合、__togredのifステートメントはthenの代わりにelseブロックに移動します。ここで何か抜けましたか?

ベストアンサー1

シェルコマンドの場合、終了ステータス0はtrue /成功を示し、他の値はfalse /失敗を示します(さまざまな種類の障害を区別するには正しい値を使用してください)。最初に正確な終了ステータス値を使用することを避け、代わりにfalseortrueコマンドを使用することをお勧めします。

__isred() {
  if [[ $(ps cax | grep redshift | wc -l) > 0 ]]
  then
    true
  else
    false
  fi
}

この時点で次のようにすることができるので、これが少し愚かなことであることに気づき始めます。

__isred() [[ $(ps cax | grep redshift | wc -l) > 0 ]]

これは[[ > ]]語彙比較のためのものです。ここで数値比較を使用する方が合理的です。

__isred() (( $(ps cax | grep redshift | wc -l) > 0 ))

しかし、実際には、これらのことが1回以上発生したことを確認したい場合は、発生回数を計算する必要はありません。

__isred() { ps cax | grep -q redshift; }

それだけで十分です。grep正規表現が一致すると成功が返されます。

これで、非標準構文を使用するときに、より移植性の高いコマンドを使用して、これをより簡単かつ確実に実行psできます。pgreppsgrep

__isred() { pgrep redshift > /dev/null; }

おすすめ記事