O zsh fornece algumas boas funções de gancho , incluindo chpwda execução de uma função depois que o usuário altera os diretórios.
# zsh only
function greet() { echo 'hi'; }
chpwd_functions+=("greet")
cd .. # hi
pushd # hi
popd # hi
Estou tentando imitar isso no bash.
Restrições:
- Ele deve funcionar em shells interativos e não interativos, o que eu acho que significa que ele não pode confiar em algo como
$PROMPT_COMMAND - Não pode redefinir
cd, porque quero que funcione para qualquer comando que altere diretórios (por exemplo,pushdepopd) - Ele deve ser executado após o comando do usuário, para
trap "my_function" DEBUGque não funcione, a menos que eu possa de alguma forma dizer lá, "primeiro execute o$BASH_COMMANDtrapping, depois faça isso ..." Vejo que posso evitar a execução automática de$BASH_COMMANDseextdebugestiver ativado ea função trap retorna 1, mas acho que não quero forçarextdebug, e retornar1para um comando bem-sucedido (mas modificado) parece errado.
A última parte - "execute o comando do usuário" - é o que atualmente me deixou perplexo. Se eu puder executar uma função após cada comando, posso verificar se o diretório foi alterado desde a última verificação. Por exemplo:
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
}
Estou no caminho certo ou existe uma maneira melhor? Como posso executar um comando no bash depois que o usuário altera os diretórios?
cdcomo princípio.
MYBIN=$( cd -P -- "$(dirname -- "$(command -v -- "$0")")" && pwd -P )favor, não altere os comandos Unix confiáveis.
bash, o que funciona da mesma forma em todos os sistemas operacionais em que é executado.
cd,pushdepopd? Quantas outras maneiras existem para alterar o diretório?