答え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
変更する必要がありますか?