zsh proporciona algunas buenas funciones de enlace , incluso chpwd
para 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,pushd
ypopd
) - Debe ejecutarse después del comando del usuario, por lo
trap "my_function" DEBUG
que no funciona, a menos que pueda decir de alguna manera, "primero ejecute lo$BASH_COMMAND
que atrapamos, luego también haga esto ..." Veo que puedo evitar la ejecución automática de$BASH_COMMAND
if siextdebug
está habilitado y la función trap devuelve 1, pero no creo que quiera forzarextdebug
, y regresar1
para 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?
cd
como 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
,pushd
ypopd
? ¿De cuántas otras maneras hay para cambiar el directorio?