Existem convenções para o nome da variável global que contém o resultado da função?

2

Uma maneira típica de uma função de shell "retornar" seu resultado é atribuí-la a alguma variável global.

Existe alguma convenção / melhor prática sobre o nome dessa variável?

    
por kjo 16.05.2017 / 16:59

1 resposta

5

REPLY é comumente usado para isso. É usado por read e select em bash , ksh e zsh pelo menos.

Na documentação zsh :

REPLY
This parameter is reserved by convention to pass string values between shell scripts and shell builtins in situations where a function call or redirection are impossible or undesirable. The read builtin and the select complex command may set REPLY, and filename generation both sets and examines its value when evaluating certain expressions. Some modules also employ REPLY for similar purposes.

reply
As REPLY, but for array values rather than strings.

Cuidado com potenciais implicações ao mudar o tipo dessa variável.

Outra abordagem seria passar o nome da variável como argumento:

get_date() {
  local date
  date=$(date)
  eval "$1=\$date"
}

Isso não funciona se estiver chamando get_date com uma variável chamada date . ksh93 aborda isso introduzindo namerefs, que são uma forma de referenciar variáveis no escopo do chamador. bash adicionou recentemente suporte a nameref, mas eles referenciam variáveis no mesmo escopo (somente por nome), portanto, não são úteis para isso.

function get_date {
  typeset -n var=$1
  var=$(date)
}

Em ksh93 , isso funciona mesmo se chamado como get_date var . Existem maneiras de fazer funcionar em bash , mksh e yash explorando um bug de unset , mas eu não iria lá porque o bug pode ser corrigido no futuro.

Outra maneira seria não usar variáveis locais em suas funções que configurassem variáveis arbitrárias além dos parâmetros $1 , $2 ... position. Isso pode tornar o código bastante ilegível. Veja por exemplo aquela implementação de uma função shell getopts_long .

    
por 16.05.2017 / 17:26