2015-12-16 3 views
2

Это действительно просто из любопытства.Bash не выводит никаких сообщений об ошибке при несуществующих командах, начиная с точки

опечатка заставила меня заметить, что в Bash, следующее:

$ .anything 

не не печатает какую-либо ошибку («ничего» не следует понимать буквально, это действительно может быть что угодно, и нет места после запятой).

Мне любопытно, как это интерпретируется в bash.

Обратите внимание, что echo $? после такой команды возвращает 127. Обычно это означает, что «команда не найдена». Это имеет смысл в этом случае, однако мне кажется странным, что сообщение об ошибке не печатается.

Почему бы $ anything фактически печатать bash:anything: command not found... (при условии, что ни anything CMD не находится в PATH), в то время как $ .anything проскальзывает молча?

система: Fedora Core 22

версия Bash: GNU Баш, версия 4.3.39 (1) -release (x86_64-RedHat-Linux-гну)

EDIT:

Некоторые ниже комментарии указывают на проблему как невоспроизводимую вначале.

Ответ @ hek2mgl ниже суммирует большой вклад в этот вопрос, который был в конце концов нашли (по @nm), как воспроизводимый в FC22 и представленном в виде сообщения об ошибке в https://bugzilla.redhat.com/show_bug.cgi?id=1292531

+4

я получаю '-bash: .anything: команда не found', вы можете сделать' тип .anything' – anubhava

+1

'$ Тип .anything -bash: Тип: .anything: не found' – cornuz

+0

Я согласен, это не воспроизводимый. – Michael

ответ

3

Баша поддерживает обработчик для ситуаций, когда команда не может быть найдена. Вы можете задать следующие функции:

function command_not_found_handle() { 
    command=$1 
    # do something 
} 

С помощью этой функции можно подавить сообщение об ошибке. Найдите эту функцию в файлах запуска bash.

Другой способ найти это - отключить функцию. Пример:

$ unset -f command_not_found_handle 
$ .anything # Should display the error message 

После некоторого исследования @n.m. выяснили, что описанное поведение по замыслу. FC22 реализует command_not_found_handle и называет программу /etc/libexec/pk-command-not-found. Эта программа является частью проекта PackageKit и будет пытаться предложить устанавливаемые пакеты, если вы наберете имя команды, которое невозможно найти.

В своей функции main() программа явно проверяет, начинается ли имя команды с точки и тихо возвращается в этом случае. Такое поведение было введено в этой фиксации:

https://github.com/hughsie/PackageKit/commit/0e85001b

в качестве ответа на этот отчет об ошибке:

https://bugzilla.redhat.com/show_bug.cgi?id=1151185

ИМХО такое поведение вызывает сомнения. По крайней мере, другие дистрибутивы этого не делают. Но теперь вы знаете, что поведение на 100% воспроизводимо, и вы можете следить за этим сообщением об ошибке.

+0

Почему downvote? – hek2mgl

+5

Я считаю, что это из-за отсутствия этого ответа. Это больше похоже на комментарий, и отформатированные комментарии обычно являются CW. (Я только догадываюсь, я не голосовал, но я бы это понял.) –

+0

Что? Что тогда? Я четко объяснил, как может случиться, что на экране не появляется сообщение. Если вы не верите в это, попробуйте! – hek2mgl

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