Las variables de entorno no se expanden correctamente cuando se relacionan con una función

Las variables de entorno no se expanden correctamente cuando se relacionan con una función

Aquí está una parte de mi .bashrcarchivo:

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

Creé una nueva función echo_pwdque imprime la ruta del directorio actual y una nueva variable de entorno que contiene el directorio actual seguido de una barra diagonal. Por lo tanto, puedo usar mi variable de entorno en la línea de comando (como $PWD).

Sin embargo, esta variable de entorno no se expande correctamente y siempre hace referencia a mi directorio de inicio:

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

¿Qué puedo hacer para que mi variable de entorno se expanda correctamente?

Nota: este es obviamente un ejemplo ficticio. En mi caso de uso específico, echo_pwdes una función mucho más compleja.

Respuesta1

Probablemente solo esté ejecutando la función y estableciendo el valor de su variable una vez.

Para actualizar automáticamente el valor de la variable cada vez que use cd, puede anular el valor integrado del shell cdde esta manera:

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

Esto llamaría al integrado cdcon cualquier argumento que le haya dado a la cdfunción y luego actualizaría el valor de su variable (tenga en cuenta que exportno es necesario si ya lo ha exportado a otro lugar, si es que es necesario exportarlo).

La configuración completa podría verse así

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

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

he optado porusandoprintfcon $PWDen lugar de llamar a la pwdutilidad, y también estoyusando $(...)para sustituciones de comandos.

Respuesta2

En export echo_pwd="`echo_pwd`/", la sustitución del comando se realiza solo una vez, cuando se establece la variable.

Si necesita actualizar el valor de la variable, deberá configurarlo nuevamente.

En bash interactivo, puedes usarPROMPT_COMMAND, que se ejecuta cada vez que se imprime el mensaje:

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

información relacionada