
Aqui está uma parte do meu .bashrc
arquivo:
echo_pwd () {
echo `pwd`
}
export echo_pwd="`echo_pwd`/"
Criei uma nova função echo_pwd
que 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 cd
da seguinte forma:
cd () {
builtin cd "$@"
echo_pwd=$( echo_pwd )/
}
Isso chamaria o built-in cd
com quaisquer argumentos que você forneceu à cd
função e, em seguida, atualizaria o valor da sua variável (observe que export
nã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 porusandoprintf
com $PWD
em vez de chamar o pwd
utilitá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/