bash function não pode alterar o valor de uma variável local quando chamado por $ ()

3

O código a seguir funciona de forma diferente, dependendo de como o Parse_Short_Switches () é chamado. Depois de chamar a função 'Parse_Short_Switches' usando resultado = $ (Parse_Short_Switches), o valor de $ error_flag NÃO está definido como -1 como seria de esperar.

Depois de chamar a função 'Parse_Short_Switches' simplesmente usando Parse_Short_Switches, o valor de $ error_flag é definido como -1 como seria de esperar.

Qualquer ajuda seria muito apreciada. Obrigado

#!/bin/bash

function Parse_Short_Switches()
{
echo "error_flag inside of the function= $error_flag" 1>&2
error_flag="-1"
echo "blah blah ..."
}

# --- MAIN ---
error_flag="999"
echo "error_flag= $error_flag"
#result=$(Parse_Short_Switches)
Parse_Short_Switches
echo "error_flag= $error_flag"
    
por BASH 01.09.2016 / 22:13

1 resposta

3

Isso porque a substituição do comando, $() , gera uma sub-rede e o comando dentro é executado nessa sub-camada.

Assim, quaisquer modificações feitas em qualquer estrutura de dados não seriam propagadas para o shell pai. Em outras palavras, as alterações estão sendo feitas corretamente, mas em um subshell, portanto, os parâmetros relevantes do shell pai não estão sendo afetados.

Como uma nota lateral, quando você executa um script, ele é executado em um subshell; Um truque comum para tornar todas as alterações dos parâmetros disponíveis no shell de chamada é source ( . ) do script.

Exemplo:

$ foo() { bar=2 ;}

$ bar=1

$ $(foo)

$ echo "$bar"
1

$ foo

$ echo "$bar"
2
    
por heemayl 01.09.2016 / 22:15