2014-11-01 37 views
2

有人可以解釋下列行爲嗎?

$ echo $SHLVL 
1 
$ zsh -c 'echo $SHLVL' 
2 
$ zsh -c '(echo $SHLVL)' 
1 

我不理解上一個結果。 zsh是否爲()子殼重置$ SHLVL? 擊的結果是不同的:

$ echo $SHLVL 
1 
$ bash -c 'echo $SHLVL' 
2 
$ bash -c '(echo $SHLVL)' 
2 

其中,至少,似乎更符合邏輯。 在一個案例中,當我測試這個時,我期待3的最後結果。爲什麼沒有shell提供這樣的結果?我對$ SHLVL的誤解是什麼?

回答

5

在bash中,變量SHLVL對於子殼體不會遞增,請參閱abs guide。對於嵌套子殼體,請參見BASH_SUBSHELL

在zsh中的文檔說,SHLVL數彈的數量,見here,並,驚奇,嵌套子shell ZSH_SUBSHELL計數,看到here

對我而言,在zsh子shell中SHLVL的遞減效果是一個bug;另一種可能性可能是SHLVLZSH_SUBSHELL可能被添加(未記錄的功能?)。

$ zsh -c 'print $SHLVL $ZSH_SUBSHELL ; (print $SHLVL $ZSH_SUBSHELL)' 
2 0 
1 1 
+0

我認爲這也是一個錯誤。這個附加假設很有趣,儘管我認爲它不太可能。如果我們不斷添加更多的子shell級別,那麼我們需要$ SHLVL的負值...(!?)我會嘗試確認它是zsh項目本身的錯誤。 Thx的詳細答案。 – elmart 2014-11-01 14:12:21

+1

看到這個:'zsh -c'(((print $ SHLVL $ ZSH_SUBSHELL)))''echoes'-1 3' – 2014-11-01 14:59:29

+0

哇。那麼你的假設似乎是真的。所以,在zsh中,實際上,真正的$ SHLVL將是$ SHLVL + $ ZSH_SUBSHELL。我必須考慮如何這樣的事情會有用。乍一看,這似乎很奇怪,因爲它會根據$ SHLVL破壞標準腳本。恭喜你,你似乎發現了一個無證的功能! – elmart 2014-11-01 15:07:19