Variável de expansão na definição de função em zsh

2

Estou com algum problema tentando avaliar / expandir uma variável quando defino uma função em zsh - isso é possível? Exemplo:

variable=foo
mytest(){
  echo ${variable}  
}
mytest           //outputs foo
variable=bar
test           //outputs bar

Eu quero variável dentro de teste () para ficar foo e não ser mais afetado por $ variável. Eu tenho lido o manual e tentando eval e citando diferente, mas nada parece funcionar.

    
por Dean 23.09.2018 / 11:55

2 respostas

1

Você quer uma variável dentro de sua função que, uma vez definida, mantenha seu valor. Como isso pode ser feito apenas com uma variável global, é necessário fornecer um nome diferente, por exemplo:

xtest(){
  typeset -g test_variable
  : ${test_variable:=$variable}
  echo $test_variable
}

Isso define test_variable na primeira invocação da função, mas não sobrescreve depois.

UPDATE: Alterei a sintaxe da definição de função de acordo com o comentário dado por Stéphane Chazelas, e também renomeiei minha função de test para xtest, porque é uma má idéia nomear uma função 'teste'.

    
por 24.09.2018 / 08:54
1

Primeiro, observe que a sintaxe de definição de função em zsh , como no shell Bourne, é:

funcname() cmd

(embora também suporte a sintaxe do ksh function funcname {...} e alguns outros).

fun não é uma palavra-chave de sintaxe zsh . Com fun foo() cmd , você define as funções fun e foo com cmd como corpo.

Eu também recomendaria contra o uso de test como o nome de uma função, pois test é o nome de um comando padrão (um embutido em zsh e a maioria dos outros shells semelhantes a Bourne).

Aqui, se você quiser uma função com uma variável local com um valor fixo, será necessário incorporar esse valor na definição da função:

mytest() {
  local variable=test
  echo $variable
}

variable será local para a função, mas ainda visível para as outras funções chamadas por mytest , se houver. Se preferir que ele fique oculto para outras funções, ou seja, para escopo estático, você pode usar private (no módulo zsh/param/private ) em vez de local .

Se você quiser que valor fixo seja o valor da variável global $variable no momento da definição de mytest , ainda será necessário incorporá-lo à definição, algo como:

zmodload zsh/param/private
eval '
  mytest() {
    private variable='${(qq)variable}'
    echo $variable
    otherfunction ...
  }
'

Onde incorporamos o conteúdo da variável (devidamente citada com ${(qq)...} ) na definição.

    
por 24.09.2018 / 10:29

Tags