コマンドが正常に実行されたことを確認するためのbashスクリプトの論理AND(&&)およびOR(||)パラドックス(終了コード0はtrueと解釈されます)

コマンドが正常に実行されたことを確認するためのbashスクリプトの論理AND(&&)およびOR(||)パラドックス(終了コード0はtrueと解釈されます)

したがって、終了コードは0プログラムが正常に実行されたと見なされることをよく理解しています。次に、これをbashスクリプトで使用し、AND最初ORのプログラムの終了状態に応じて次のプログラムを実行します。良い例はここにあります:https://unix.stackexchange.com/a/187148/454362

0これはtrueと解釈され、ゼロ以外の数字はfalseと解釈されるという意味ですか?これは私が知っているすべてのプログラミング言語とは反対です。では、bashが内部的にロジックを使用してNOT終了コードを正しいfalse / true値に戻すと仮定できますか?

以下はいくつかの例です。

#should result in false, and bash shows 0 as false
echo $(( 1 && 0 ))

# should result in true,  and bash shows 1 as true
echo $(( 1 || 0 )) 

# does not show 'hi'; even though if false is zero per first example, then
# this should be considered success exit code and 'hi' to be shown!!
false && echo 'hi' 

# does show 'hi'. It first runs the "echo 'hi'" and interprets its exit
# status of zero as success, but then false stops the 2nd hi.
echo 'hi' && false && echo ' 2nd hi' 

# shows 'hi 2nd hi'
echo 'hi' && (( 1 || 0 )) && echo ' 2nd hi'

私自身の質問に答えるようです。しかし、誰かがbash処理の内部を知っているかどうかを明確にしたかったのです。

ベストアンサー1

リンクした投稿の例は次のとおりです。

false && echo "OK"
true || echo "OK"

この場合、プロセスの終了ステータスはyes 0、残りはfalseです。 (はい、これはプログラムtrueですfalse。おそらくシェルに組み込まれていますが、同じように動作します。)

~からPOSIXの定義||同様にバッシュ文書説明する):

ANDリスト
制御演算子「&&」はANDリストを表す。形式は次のようにする必要があります。
command1 [ && command2] ...
コマンド1実装する必要があります。終了ステータスが0の場合コマンド2処刑しなければならないなど...

はい、これは他のほとんどのコンテキストおよびプログラミング言語で使用される規則に違反しています。次に、Cでは、関数が成功した場合は0を返し、エラーの場合は0以外のエラーコードを返します。これにより、さまざまな種類のエラーを区別できます(*)。もちろん、関数は有用な値(ポインタなど)を返す必要があり、Cに関する限り、0は偽の場合は実際には機能しません。とにかく違います。

実装についてどんな仮定もするのは良い考えではないと思います。この場合、0は真であることを覚えておいてください。たとえば、(true && true) は (true) です。

(*家族と同様に、Happyシステムコールはすべて似ています。Unhappyシステムコールはそれぞれそれなりに不幸です。)


もしそうなら、あなたの例は次のとおりです。

#should result in false, and bash shows 0 as false
echo $(( 1 && 0 ))

&&ここでは、終了状態と同じ規則に従わない算術コンテキストで使用しています。ここで、0は偽で、1は真です。 (true AND false)も同様です1 && 0。これは(false)または0です。

# should result in true,  and bash shows 1 as true
echo $(( 1 || 0 )) 

上記と似ています。

# does not show 'hi'; even though if false is zero per first example, then
# this should be considered success exit code and 'hi' to be shown!!
false && echo 'hi'

これユーティリティが呼び出されます。false状態1(または少なくともゼロ以外の値)で終了します。この場合、これは間違っているため、&&段落ロジックを介して右側をスキップします。

# does show 'hi'. It first runs the "echo 'hi'" and interprets its exit
# status of zero as success, but then false stops the 2nd hi.
echo 'hi' && false && echo ' 2nd hi'

同じ。


# shows 'hi 2nd hi'
echo 'hi' && (( 1 || 0 )) && echo ' 2nd hi'

ここで使用しましたが、1 || 0どちらも正確で算術的文脈では数値が多少失われます。次を試してみましょう。

$ echo foo && (( 0 )) && echo bar
foo
$ echo foo && (( 1 )) && echo bar
foo
bar

今、((...))算術構造です(例$((...)):)、ここで0は偽です。$((...))とは異なり、((...))コマンドでもあるため、終了状態があります。内部式がゼロ以外の値(true)と評価された場合は0(true)で終了し、内部式が0(false)と評価されると1(false)で終了します。まあ、これは混乱するかもしれませんが、最終的な結果は、Cのような暗黙の比較が内部的にゼロで動作し、それをシェルの条件付きで使用すると同じ真理値を得ることです。

したがって、ゼロになるwhile (( i-- )); do ...まで繰り返します。i

(( foo ))標準ではありませんが、ksh / Zsh / Bashでサポートされています。標準の解釈はfoo2つのネストされたサブシェル内のコマンドなので、「コマンド 'foo'が見つかりません」というエラーが表示されることがあります。)

(( true )) && echo maybeこのようなことは、おそらく何も印刷しないことを指摘する価値があります。算術的文脈では、通常の単語は変数名として扱われるため(多くのシェルで再帰的に)、変数がゼロ以外の値trueに設定されていない場合は(( true ))falseになります。


(難読化部門のアイデアが実行されていますtrue=0; false=1; true() (exit 1); false() (exit 0);。今何が印刷され true && (( false )) || echo maybe && echo maybe notているのですか?)

おすすめ記事