Variáveis ​​de ambiente não se expandem corretamente quando relacionadas a uma função

Variáveis ​​de ambiente não se expandem corretamente quando relacionadas a uma função

Aqui está uma parte do meu .bashrcarquivo:

echo_pwd () {
    echo `pwd`
}
export echo_pwd="`echo_pwd`/"

Criei uma nova função echo_pwdque imprime o caminho do diretório atual e uma nova variável de ambiente que contém o diretório atual seguido por uma barra. Portanto, posso usar minha variável de ambiente na linha de comando (como $PWD).

No entanto, esta variável de ambiente não se expande corretamente e sempre se refere ao meu diretório inicial:

~/Documents$ env | grep echo_pwd
echo_pwd=/home/pierre/
~/Documents$

O que posso fazer para que minha variável de ambiente se expanda corretamente?

Nota: este é obviamente um exemplo fictício. No meu caso de uso específico, echo_pwdé uma função muito mais complexa.

Responder1

Provavelmente você está executando a função e definindo o valor da sua variável apenas uma vez.

Para atualizar automaticamente o valor da variável sempre que usar cd, você pode substituir o interno do shell cdda seguinte forma:

cd () {
    builtin cd "$@"
    echo_pwd=$( echo_pwd )/
}

Isso chamaria o built-in cdcom quaisquer argumentos que você forneceu à cdfunção e, em seguida, atualizaria o valor da sua variável (observe que exportnão é necessário se você já a exportou para outro lugar, se precisar ser exportada).

A configuração completa pode parecer

echo_pwd () {
    printf '%s\n' "$PWD"    # or just: pwd
}
export echo_pwd="$( echo_pwd )/"

cd () {
    builtin cd "$@"
    echo_pwd=$( echo_pwd )/
}

Eu optei porusandoprintfcom $PWDem vez de chamar o pwdutilitário, e também estouusando $(...)para substituições de comandos.

Responder2

Em export echo_pwd="`echo_pwd`/", a substituição do comando é realizada apenas uma vez, quando a variável é definida.

Se precisar atualizar o valor da variável, você precisará defini-la novamente.

No bash interativo, você poderia usarPROMPT_COMMAND, que é executado sempre que o prompt é impresso:

$ PROMPT_COMMAND='echo_pwd="`echo_pwd`/"'
$ cd bar/
$ echo $echo_pwd/
/tmp/foo/bar//
$ cd baz
$ echo $echo_pwd
/tmp/foo/bar/baz/

informação relacionada