$ SHLVL não aumenta em (echo $ SHLVL)

1

Estou aprendendo scripts de shell e atendo-me a estes pequenos scripts de shell experimentais:

1 #!/usr/bin/env bash
2 A=1
3 (A=2;echo "A is $A in $SHLVL")
4 echo "A is $A in $SHLVL"
5 exit 0

Sem dúvida, $ A na linha 3 e na linha 4 são diferentes entre si, o que pode ser explicado porque o processo pai não pode ler variáveis criadas no processo filho, ou seja, a sub-camada. No entanto, o $ SHLVL na linha 3 e linha 4 é o mesmo, que eu pensei que $ A na linha 3 deveria ter sido maior que $ A na linha 4 por 1. Não os comandos na linha 3 executados em subshell? Não sei onde interpretei mal.

Obrigado pela sua ajuda.

    
por Han XIAO 12.01.2018 / 12:52

2 respostas

0

Seu nível de shell não está mudando no script que você criou. Quando você echo $SHLVL no seu terminal, você verá o nível de execução atual do shell. Se você usar o comando bash no seu terminal, você terá criado uma subcamada e aumentado o nível do shell até sair dessa sub-tampa. O subshell que você cria em seu script é um filho de um pai executando no nível shell do pai. É por isso que $SHLVL é o mesmo nos processos pai e filho.

    
por 12.01.2018 / 13:19
0

No Guia avançado de script de script , encontrei o seguinte:

While the $BASH_SUBSHELL internal variable indicates the nesting level of a subshell, the $SHLVL variable shows no change within a subshell.

Parece certo, cabe seus resultados. Por outro lado, Manual de Referência do Bash diz:

SHLVL

Incremented by one each time a new instance of Bash is started. This is intended to be a count of how deeply your Bash shells are nested.

Eu admito que isso pode ser enganoso. Acho que "uma nova instância do Bash é iniciada" quando você chama explicitamente bash . De acordo com essa interpretação, subshells como (…) não contam; eles são tratados como partes da casca original.

    
por 12.01.2018 / 13:47