Quando 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+ Cele está ecoando algum rastreamento de pilha de exceção do python. Algo está errado? Como posso consertar isso?
Por exemplo, quando digito "sdf", não faz nada. "sdf" não é um comando válido.
Mas quando pressiono Ctrl+ C, ele imprime esse rastreamento de pilha de exceção python.
O rastreamento de pilha é sempre diferente.
Estou usando o Ubuntu 14.04, entã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
lançou um erro
Atualizar:
Então, depois de tentar várias abordagens, acabei reinstalando o Ubuntu. Seguirresposta de wjandreae os comentários parecem estar certos na identificação do problema.
Responder1
/etc/bash.bashrc
define uma função command_not_found_handle
, que chama /usr/lib/command-not-found
, que é um script Python 3. Este manipulador é chamado para comandos que o Bash não consegue encontrar.
Então, como correção do curativo, você pode desarmar o manipulador:
unset -f command_not_found_handle
Atualização 2:
Após alguma discussão com o OP, descobriu-se que o problema é causado por um executável do Python 2.7 colocado acidentalmente em /usr/bin/python3.4. (Então minha primeira atualização não foi muito útil, mas está emrevisão 4se você quiser ler). Se isso acontecer com você,não reinicie seu computador! Algumas partes da GUI dependem do Python 3. Provavelmente você também precisará manter o terminal aberto.
Aliás, 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
na verdade é Python 2, o processo se repete.
Atualização 3:
O OP acabou reinstalando o Ubuntu, mas fiquei curioso, então abri uma VM, causei um problema semelhante (se não o mesmo) e corrigi-o.
Causou o problema
sudo cp /usr/bin/python2.7 /usr/bin/python3.4
Confirmado o problema
- Correu
python3 --version
, conseguiuPython 2.7.6
- Tentei executar
sdf
, tive que pressionar Ctrl+C para interromper o loop
- Correu
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 verifiquei (python3
,python3.4
,python3-minimal
) dependempython3.4-minimal
por esse motivo.
(OP e eu tropeçamos nessa solução pela primeira vez. Para obter mais detalhes sobre o que tentei, o que mais errei e como consertei, leiarevisão 9 desta resposta.)