zsh proporciona algunas buenas funciones de enlace , incluso chpwdpara ejecutar una función después de que el usuario cambie los directorios.
# zsh only
function greet() { echo 'hi'; }
chpwd_functions+=("greet")
cd .. # hi
pushd # hi
popd # hi
Estoy tratando de emular eso en bash.
Restricciones:
- Debe funcionar tanto en shells interactivos como no interactivos, lo que creo que significa que no puede confiar en algo como
$PROMPT_COMMAND - No se puede redefinir
cd, porque quiero que funcione para cualquier comando que cambie los directorios (por ejemplo,pushdypopd) - Debe ejecutarse después del comando del usuario, por lo
trap "my_function" DEBUGque no funciona, a menos que pueda decir de alguna manera, "primero ejecute lo$BASH_COMMANDque atrapamos, luego también haga esto ..." Veo que puedo evitar la ejecución automática de$BASH_COMMANDif siextdebugestá habilitado y la función trap devuelve 1, pero no creo que quiera forzarextdebug, y regresar1para un comando exitoso (pero modificado) parece incorrecto.
La última parte, "ejecutar después del comando del usuario", es lo que actualmente me tiene perplejo. Si puedo ejecutar una función después de cada comando, puedo hacer que verifique si el directorio ha cambiado desde la última vez que lo verificamos. P.ej:
function check_pwd() {
# true in a new shell (empty var) or after cd
if [ "$LAST_CHECKED_DIR" != "$PWD" ]; then
my_function
fi
LAST_CHECKED_DIR=$PWD
}
¿Estoy en el camino correcto, o hay una mejor manera? ¿Cómo puedo ejecutar un comando en bash después de que el usuario cambie los directorios?
cdcomo principio.
MYBIN=$( cd -P -- "$(dirname -- "$(command -v -- "$0")")" && pwd -P )No modifique los comandos de confianza de Unix.
bash, lo que funciona más o menos igual en todos los sistemas operativos en los que se ejecuta.
cd,pushdypopd? ¿De cuántas otras maneras hay para cambiar el directorio?