Existe uma maneira de localizar variáveis para a função atual em 'mksh' mas não para outras?

1

Existe uma maneira de $val ser definido em a () , mas não ser visto por b () ?

set -u -e -o pipefail


a () {
  local +x val="myval"
  echo "in a: VAL= $val"
  b
}

b () {
  echo "in b: VAL= $val"
}

a

Produz:

in a: VAL= myval
in b: VAL= myval  # This should not happen.

Eu esperava usar as opções local / typeset em vez do uso de subshells para proteger as variáveis de serem vistas em outras funções.

Eu verifiquei o manual (seção Funções, seção typeset) e não há Não parece ser um caminho. No entanto, eu poderia facilmente ter perdido algo.

    
por dgo.a 04.04.2016 / 08:17

1 resposta

0

Em vez de restringir variáveis com subshells, você pode executar b como um novo processo. Então, ele não terá acesso a nenhuma das variáveis do chamador, exceto aquelas que você escolheu exportar.

Mover função para um novo script

Se você precisar apenas de uma única função, mova toda a função para um script separado.

b :

#!/usr/bin/env mksh
set -u -e -o pipefail

echo "in b: VAL= $val"

Saída:

in a: VAL= myval
./b[4]: val: parameter not set

Use uma função de wrapper

Se você tem muitas funções que precisam disso, você pode movê-las para um único arquivo e incluir uma função de wrapper para fornecer e executar.

funcs :

#long options not passed on by -$-
set -o pipefail

#execute function without inheriting environment variables
function ni () {
  WHERE="${_%/*}"
  mksh -$- -c "source $WHERE/funcs ; $*"
}

function a () {
  local +x val="myval"
  echo "in a: VAL= $val"
  ni b
}

function b () {
  echo "in b: VAL= $val"
}

Esta "biblioteca" precisará ser source d do script principal:

#!/usr/bin/env mksh

set -e -u -o pipefail

WHERE="${_%/*}"
source $WHERE/funcs

a

Isso tem a desvantagem de perder o local (o script e o número da linha) do erro:

in a: VAL= myval
mksh: val: parameter not set
    
por 06.07.2016 / 12:22

Tags