Por que o set -x não funciona dentro do eval dentro de uma função em fish?

3

Eu me deparei com um problema tentando definir dinamicamente algumas variáveis com base na saída de um programa, em uma função de peixe.

Limitei meus problemas a um MWE:

function example
    eval (echo 'set -x FOO 1;')
end

chamando:

>example
>echo $FOO

resulta em nenhuma saída - ou seja, a variável de ambiente FOO não foi definida. Como devo ter feito isso?

    
por Lyndon White 31.01.2015 / 15:58

2 respostas

7

O mesmo acontece de forma mais simples:

function trythis
     set -x foo bar
end

Se você executar agora trythis e echo $foo , também não será definido. Isso porque o -x do fish por si só não altera o escopo da variável, que por padrão é local para a função, a menos que exista globalmente ou universalmente já.

Tente:

  eval (echo 'set -gx FOO 1;') 

Onde o g é global. Isso faz com que a variável funcione como um valor normal de POSIX export ed. É interessante que funcione da mesma forma com eval , como seria com apenas set ; se você usar essa linha sans g direto na linha de comando, $FOO é definido, portanto, eval e substituição de processo () não introduziram um novo escopo ou subshell e, quando executados dessa maneira dentro de uma função < em> o escopo da função se aplica.

    
por 31.01.2015 / 16:12
7

Você precisará fornecer um escopo para o comando set . Sem ele, o escopo padrão é local para a função. Veja a seção manual de peixes em Variáveis de Ambiente para as regras padrão para o escopo da variável

Experimente set -gx FOO .

    
por 31.01.2015 / 16:11

Tags