私の.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 /失敗を示します(さまざまな種類の障害を区別するには正しい値を使用してください)。最初に正確な終了ステータス値を使用することを避け、代わりにfalse
ortrue
コマンドを使用することをお勧めします。
__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
できます。pgrep
ps
grep
__isred() { pgrep redshift > /dev/null; }