Meus comandos de terminal do Ubuntu parecem estar rodando em python

2

Quando eu executo um comando errado no meu terminal Ubuntu, em vez de ecoar "comando não encontrado", o terminal não faz nada, e quando pressiono Ctrl + C está fazendo eco em algum rastreio de pilha de exceção do python. Algo está errado? Como posso consertar isso?

Por exemplo, quando eu digito "sdf", não faz nada. "sdf" não é um comando válido.

Mas quando pressiono Ctrl + C , ele imprime este rastreamento de pilha de exceção do python.

O rastreamento de pilha é diferente a cada vez.

Estou usando o Ubuntu 14.04, então o python2 é o padrão

$ type python python2 python3
python is /usr/bin/python
python2 is /usr/bin/python2
python3 is hashed (/usr/bin/python3)
$ readlink /usr/bin/python /usr/bin/python2 /usr/bin/python3
python2.7
python2.7
python3.4
$ python --version
Python 2.7.6
$ python3 --version
Python 2.7.6
$ readlink /usr/bin/python3.4
$ 
  • sudo apt-get install --reinstall python não ajudou.
  • sudo apt-get install --reinstall python3 jogou um erro

Atualizar :
Então, depois de tentar muitas abordagens, acabei reinstalando o Ubuntu. Siga a resposta do wjandrea e os comentários, parecem estar no ponto de identificar o problema.

    
por Ishtiaque Khan 23.11.2017 / 18:03

1 resposta

4

/etc/bash.bashrc define uma função command_not_found_handle , que chama /usr/lib/command-not-found , que é um script do Python 3. Esse manipulador é chamado para comandos que o Bash não consegue encontrar.

Então, como uma correção de bandagem, você pode remover o manipulador:

unset -f command_not_found_handle

Atualização 2:

Após alguma discussão com o OP, o problema é causado por um executável do Python 2.7 acidentalmente colocado em /usr/bin/python3.4. (Então, minha primeira atualização não foi muito útil, mas está em revisão 4 se você quiser lê-la). Se isso acontecer com você, não reinicie o computador! Algumas partes da GUI dependem do Python 3. Você provavelmente precisará manter o terminal aberto também.

BTW, isso explica o loop infinito ao chamar um comando desconhecido no prompt do Bash. /usr/lib/command-not-found tem esta seção:

if sys.version < '3':
    # We might end up being executed with Python 2 due to an old
    # /etc/bash.bashrc.
    import os
    if "COMMAND_NOT_FOUND_FORCE_PYTHON2" not in os.environ:
        os.execvp("python3", [sys.argv[0]] + sys.argv)

O que significa que quando executado pelo Python 2, ele chama python3 , mas como python3 é realmente o Python 2, o processo é repetido.

Atualização 3:

OP acabou reinstalando o Ubuntu, mas fiquei curioso, então eu abri uma VM, causei um problema semelhante (se não o mesmo problema) e corrigi-lo.

  1. Causou o problema

    sudo cp /usr/bin/python2.7 /usr/bin/python3.4
    
  2. Confirmado o problema

    • Ran python3 --version , obteve Python 2.7.6
    • Tentei executar sdf , tive que pressionar Ctrl + C para parar o loop
  3. Corrigido:

    sudo apt-get install --reinstall python3.4-minimal
    

    O pacote python3.4-minimal fornece o próprio executável do Python 3.4. Todos os outros pacotes que eu verifiquei ( python3 , python3.4 , python3-minimal ) dependem de python3.4-minimal por esse motivo.

(OP e eu tropeçamos nesta solução na primeira vez. Para mais detalhes sobre o que eu tentei, o que mais eu estraguei e como consertei, leia revisão 9 desta resposta .)

    
por wjandrea 23.11.2017 / 22:04