Atualizando funções e aliases do shell através de variáveis de ambiente

2

Digamos que definamos a seguinte função shell e alias em .zshenv :

export VARIABLE_A='original'

function my_function()
{
    print $VARIABLE_A
}

export VARIABLE_B='original'

alias my_alias="print $VARIABLE_B"

Agora, digamos que iniciamos um novo shell interativo e fazemos o seguinte:

$ my_function
$ export VARIABLE_A='new'
$ my_function


$ my_alias
$ export VARIABLE_B='new'
$ my_alias

Os comandos acima são impressos:

original
new
original
original

Parece que a função está atualizada, mas o alias não é. Esse comportamento é esperado? E se sim, por quê?

    
por Amelio Vazquez-Reina 30.03.2016 / 20:11

2 respostas

2

Sim, o comportamento é esperado. A razão é simplesmente que você usou aspas duplas ( "…" ) ao definir o alias, permitindo a substituição de parâmetros. Isso levou a que $VARIABLE_B fosse substituído no momento da definição do pseudônimo, em vez de sua execução.

Essencialmente, ao escrever

VARIABLE_B="original"
alias my_alias="print $VARIABLE_B"

zsh substituirá $VARIABLE_B antes de executar o comando alias da seguinte forma:

alias my_alias="print original"

Portanto, o alias my_alias sempre será substituído por print original antes da execução.

Se você quiser substituir um parâmetro em tempo de execução, é necessário citá-lo com aspas simples ( '…' ) ou citando $ com \ :

alias my_alias='print $VARIABLE_B'
alias my_alias="print \$VARIABLE_B"

Isso definirá o alias para que o nome da variável permaneça como parte do comando e o alias my_alias seja realmente substituído por print $VARIABLE_B antes da execução.

Em contraste, os parâmetros dentro de uma definição de função não precisam ser citados explicitamente, eles são sempre substituídos apenas em tempo de execução.

Então, ao escrever

my_function () {
{
    print $VARIABLE_A
}

isto é exatamente o que será armazenado. Ao executar my_function $VARIABLE_A será substituído com o valor que tem naquele momento.

    
por 30.03.2016 / 23:33
0

Say we define the following shell function and alias in .zshenv:

Os aliases são avaliados na execução de um script. Então $ VARIABLE_B é avaliado e substituído por seu valor no momento em que seu .zshenv é processado. Qualquer valor que você atribuir a VARIABLE_B posteriormente não afetará o alias.

Pelo contrário, as funções não avaliam as variáveis do ambiente quando são processadas. Variáveis ambientais na função são avaliadas quando uma função é chamada.

    
por 30.03.2016 / 21:03