Zshネストされたコマンドパラメータ$ SLVLが正しくありませんか?

Zshネストされたコマンドパラメータ$ SLVLが正しくありませんか?

Zshバージョン5.2で私が観察した動作のいくつかは、私が偶然に見つけて連絡したもう一つの可能​​なバグに関連しているかどうか疑問に思います。前の質問

以下のコード:

zsh -c "zsh -c 'zsh -c \"echo \$SHLVL\"'"

エコが2出ました$SHLVL。これを以下と比較してみてください。

sh -c "zsh -c 'zsh -c \"echo \$SHLVL\"'"

3どこかでエコーが聞こえます$SHLVL

これは私がやっていることと似たバグである可能性がありますか?前の質問

ベストアンサー1

少し単純化してみましょう。

$ SHLVL=1 zsh -c 'echo $SHLVL; zsh -c "echo \$SHLVL"'
2
2
$ SHLVL=1 zsh -c 'echo $SHLVL; zsh -c "echo \$SHLVL"; true'
2
3

最後のコマンドが外部コマンドの場合、zshは分岐なしでそれを実行します(テールコールの最適化)。$$次の点に加えて、エコーでこれを観察できますSHLVL。最初のケースでは、zshへのネストされた呼び出しは同じPIDを持ちます。 2番目のケースでは、親プロセスが後ろに残るため、ネストされた呼び出しは子プロセスとして実行されますtrue

sh動作が異なるため、他の動作を見ることができます。おそらくあなたのものがshテールコールの最適化を実行していないbashかもしれません。あるいは、tail call最適化を実行するksh93かもしれませんが、SHLVLこの場合も増加します。

SHLVL尾を呼び出すときにzshを増やす必要がありますか?これに対する正式な標準はありませんが、テールコールは最適化と見なされ、プロセススケジューリング以外の動作は同じであると予想されるので意味があります。 ATT kshが異なる動作をするという事実は、zshがこれを行うべきではないことを意味します。それからまた、

$ SHLVL=1 ksh -c 'echo $SHLVL; exec ksh -c "echo \$SHLVL"'
2
3

SHLVL明示的なksh93を使用しても増加しますがexec、これは言葉にならないと思います。シェルが交換されたら、なぜSHLVL変更する必要がありますか?

おすすめ記事