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
.