Você precisa substituir / alterar a função command_not_found_handle
shell:
type command_not_found_handle
Quando eu digito (em bash
) um comando que o linux não encontra, ele geralmente faz algo assim:
$ x
x: command not found
mas quando eu digito um comando que não é encontrado mas que é similar em algum sentido a outros comandos possíveis, a resposta pode ser assim:
$ pyp
No command 'pyp' found, did you mean:
Command 'pcp' from package 'pcp' (universe)
Command 'pype' from package 'pype' (universe)
Command 'pgp' from package 'pgpgpg' (universe)
Command 'pp' from package 'libpar-packer-perl' (universe)
Command 'php' from package 'php5-cli' (main)
Command 'gyp' from package 'gyp' (universe)
Command 'pip' from package 'python-pip' (universe)
Command 'pap' from package 'netatalk' (universe)
pyp: command not found
Isso significa que algum gancho verificou pyp
antes de deixar bash
responder com pyp: command not found
.
Eu gostaria de escrever um hook assim, que irá verificar se o "command" é um nome de um branch em um repositório atual (se estivermos de fato em um repositório), e tentará fazer o checkout nele antes de responder com command not found
, mas apenas se o comando realmente não foi encontrado.
Para isso, preciso entender algo sobre o fluxo; quando eu digito o comando (e pressiono enter), para onde ele vai? Qual é o programa que responde com "você quis dizer", e como ele recebe a string de comando do bash?
O pacote command-not-found
é responsável por esse comportamento no Debian e no Ubuntu. Não é necessário definir seu próprio manipulador, no entanto. Você pode usar command_not_found_handle
da seguinte forma:
command_not_found_handle() {
if [ -d .git ] || git rev-parse --is-git-dir 2>/dev/null; then
git checkout "$1" 2>/dev/null
else
printf '%s: %s: command not found\n' "$0" "$1"
return 127
fi
}
Para suprimir mensagens como Sua filial está atualizada com "origem / mestre". , use &>
em vez de 2>
: git checkout "$1" &>/dev/null
.
nyuszika7h@cadoth ~ > master
-bash: master: command not found
127 nyuszika7h@cadoth ~ > cd src/github/nyuszika7h/Limnoria/
nyuszika7h@cadoth ~/src/github/nyuszika7h/Limnoria master > testing
Your branch is up-to-date with 'origin/testing'.
nyuszika7h@cadoth ~/src/github/nyuszika7h/Limnoria testing > foobar
-bash: foobar: command not found
127 nyuszika7h@cadoth ~/src/github/nyuszika7h/Limnoria testing >
zsh - Verifique se o diretório atual é um repositório Git - Stack Overlow