Falling to git checkout em comandos bash não encontrados

4

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?

    
por Bach 21.05.2014 / 09:50

2 respostas

3

Você precisa substituir / alterar a função command_not_found_handle shell:

type command_not_found_handle
    
por 21.05.2014 / 09:52
0

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 .

Exemplo

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 >

Fontes

zsh - Verifique se o diretório atual é um repositório Git - Stack Overlow

    
por 21.05.2014 / 21:45

Tags