O zsh fornece algumas boas funções de gancho , incluindo chpwd
a 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,pushd
epopd
) - Ele deve ser executado após o comando do usuário, para
trap "my_function" DEBUG
que não funcione, a menos que eu possa de alguma forma dizer lá, "primeiro execute o$BASH_COMMAND
trapping, depois faça isso ..." Vejo que posso evitar a execução automática de$BASH_COMMAND
seextdebug
estiver ativado ea função trap retorna 1, mas acho que não quero forçarextdebug
, e retornar1
para 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?
cd
como 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
,pushd
epopd
? Quantas outras maneiras existem para alterar o diretório?