Когда я запускаю неправильную команду на моем терминале Ubuntu, вместо того, чтобы вывести "команда не найдена", терминал ничего не делает, а когда я нажимаю Ctrl+, Cон выводит какую-то трассировку стека исключений python. Что-то не так? Как это исправить?
Например, когда я ввожу «sdf», ничего не происходит. «sdf» — недопустимая команда.
Но когда я нажимаю Ctrl+ C, он печатает эту трассировку стека исключений Python.
Трассировка стека каждый раз разная.
Я использую Ubuntu 14.04, поэтому python2 используется по умолчанию.
$ 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
не помогло.sudo apt-get install --reinstall python3
выдал ошибку
Обновлять:
Итак, перепробовав множество подходов, я в итоге переустановил Ubuntu. Подписатьсяответ wjandreaи комментарии, похоже, точны в определении проблемы.
решение1
/etc/bash.bashrc
определяет функцию command_not_found_handle
, которая вызывает /usr/lib/command-not-found
, который является скриптом Python 3. Этот обработчик вызывается для команд, которые Bash не может найти.
Поэтому в качестве временного решения вы можете отключить обработчик:
unset -f command_not_found_handle
Обновление 2:
После некоторого обсуждения с автором выяснилось, что проблема вызвана исполняемым файлом Python 2.7, случайно помещенным в /usr/bin/python3.4. (Поэтому мое первое обновление было не очень полезным, но оно впересмотр 4если вы хотите прочитать это). Если это случится с вами,не перезагружайте компьютер! Некоторые части графического интерфейса зависят от Python 3. Вероятно, вам также придется держать терминал открытым.
Кстати, это объясняет бесконечный цикл при вызове неизвестной команды в командной строке Bash. /usr/lib/command-not-found
В нем есть этот раздел:
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)
Это означает, что когда он выполняется Python 2, он вызывает python3
, но поскольку python3
это на самом деле Python 2, процесс повторяется.
Обновление 3:
Автор статьи в итоге переустановил Ubuntu, но мне было любопытно, поэтому я открыл виртуальную машину, вызвал похожую проблему (если не ту же самую) и исправил ее.
Вызвал проблему
sudo cp /usr/bin/python2.7 /usr/bin/python3.4
Подтверждено наличие проблемы
- Побежал
python3 --version
, получилPython 2.7.6
- Попробовал запустить
sdf
, пришлось нажать Ctrl+C, чтобы остановить цикл
- Побежал
Починил это:
sudo apt-get install --reinstall python3.4-minimal
Пакет
python3.4-minimal
предоставляет сам исполняемый файл Python 3.4. Все остальные проверенные мной пакеты (python3
,python3.4
,python3-minimal
) зависят от негоpython3.4-minimal
по этой причине.
(OP и я наткнулись на это решение в первый раз. Более подробную информацию о том, что я пробовал, что еще я накосячил и как я это исправил, читайте здесь.редакция 9 этого ответа.)