Usando o aliasing de diretiva e namespace com o Ksh

2

Posso criar um alias para um namespace de shell korn? Existe alguma coisa parecida com a diretiva using em C++ (colocar vários namespaces juntos e lançar um erro (compilador) se a designação de um símbolo for ambígua)?

    
por PSkocik 05.07.2015 / 16:46

1 resposta

3

Mesmo que o ksh tenha recursos mais avançados do que outros shells, ainda é uma linguagem para automatizar tarefas simples e escrever pequenos scripts, não uma linguagem voltada para a criação de aplicativos enormes. Você não pode esperar ter todos os recursos de uma linguagem típica projetada para aplicativos grandes, muito menos todos os recursos do C ++.

Eu não acho que você pode criar um alias para um namespace. Você pode criar uma cópia de um namespace de classificações enumerando suas variáveis (analisar a saída de typeset +p ou typeset -p ou usar ${!.foo.*} se desejar incluir variáveis herdadas do namespace pai) e copiá-las uma a uma . Você pode tornar uma variável um alias de outra com typeset -n , mas isso só entra em vigor quando usado dentro do namespace:

$ namespace foo { x=1; }
$ namespace bar { typeset -n x=.foo.x; echo $x; }
1
$ namespace foo { x=2; }
$ namespace bar { echo $x; }
2
$ echo ${.bar.x}
.foo.x

O Ksh permite ir mais longe e executar código arbitrário quando uma variável é lida, modificada ou não definida, com funções de disciplina. Por exemplo, se você definir uma função chamada x.get , essa função será invocada sempre que o valor de x for recuperado.

namespace bar {
  x.get () { _=${.foo.x}; }
  x.set () { .foo.x=${.sh.value}; }
  x.append () { .foo.x+=${.sh.value}; }
  x.unset () { unset ${.sh.name}; }
}

Eu acho que você tem que defini-los para cada variável, e você não pode detectar variáveis que são adicionadas ao namespace foo .

Isso pode ser estendido para procurar vários namespaces.

x.get () {
  if ((${.foo.x+1}+${.bar.x+1}!=1)); then
    echo 1>&2 "Ambiguous variable x, available in more than one of foo and bar"
    exit 125
  fi
  _=${.foo.x-${.bar.x}}
}
    
por 06.07.2015 / 02:11

Tags