2015-05-12 2 views
13

Каждый раз, когда я пытаюсь вызвать команду, которая не существует ($ a, например) в консоли (/ bin/bash), интерпретатор ждет долгое время. И когда я прерываю его (^ C), я получаю сообщение об ошибке от интерпретатора Python. Вместо этого я ожидаю, что он скажет мне, что команда не распознана. Почему это происходит?Нераспознанные команды в bash захватываются интерпретатором python

$ a 
^C 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/encodings/__init__.py", line 32, in <module> 
[email protected]:/home/antonio/workspace/biz_index#  from encodings import aliases 
    File "/usr/lib/python2.7/encodings/aliases.py", line 17, in <module> 
    """ 
KeyboardInterrupt 
^C 
+5

Что находится в вашей 'PATH'? –

+3

Каков результат 'which a'? –

+2

Случается ли это только в определенной директории или везде? Вероятно, вы случайно затеняли встроенный пакет Python с некоторым собственным кодом. –

ответ

7

Если параметр PATH="" исправляет его, то что-то, где-то затеняет пакет python, который вызывается пакетом command-not-found. Я недавно сделал это сам, написав сценарий под названием struct.py. Вам нужно пройти через каждый каталог в пути, то есть

/home/antonio/.local/bin 
/home/antonio/.local/bin 
/usr/local/sbin 
/usr/local/bin‌​ 
/usr/sbin 
/usr/bin 
/sbin 
/bin 
/usr/games 
/usr/local/games 

и искать .py файлы там. Один из них имеет имя с одним из встроенных пакетов Python. Кроме того, вы можете удалить каталоги из своего PATH и добавить их обратно до тех пор, пока не узнаете, какой из них его разрывает. Как только вы его найдете, вам нужно удалить его или переименовать.

Вот Снаряд Однострочник, чтобы сделать это для вас:

for dir in $(echo $PATH | tr ":" "\n"); do ls -1 $dir | grep "[.]py"; done 

Вы можете проверить это в своей собственной оболочке, пытаясь следующее (воссоздавая свою ошибку от нескольких дней назад):

echo 'print("HELLO WORLD")' >> struct.py 

Теперь в моей оболочке, оставаясь в текущем каталоге, я вижу:

➜ client git:(master) ✗ a 
HELLO WORLD 
zsh: command not found: a 

Предположительно сценарий Python, который делает затенение в вашем случае, делает что-то более ресурсоемкое, чем просто печать «HELLO WORLD», следовательно, висит.

16

Вы на машине ubuntu? Ubuntu имеет command-not-found package, который реализован в python, возможно, вы прервали это.

На вашем пути может быть сценарий с тем же именем, что и тот, который вызывается пакетом command-not-found. Если есть, этот скрипт, скорее всего, тот, кто делает висячие. Чтобы напечатать свой путь читаемым способом, запустите echo $PATH | tr -s ':' '\n'.

+0

Да, это Ubuntu. Как я могу это исправить? – AntonioRomero

+0

@ AntonioRomero Я согласен, что мой ответ не касается висит. Расследование, когда мы говорим ... – EvenLisle

Смежные вопросы