Вопрос или проблема
Почему я получаю эту ошибку при использовании zsh и как это исправить?
Ошибка завершения при выполнении команды: "trial" "foo" "--_shell-completion" "zsh:2"
Если вывод ниже не помогает, вам, возможно, придется отредактировать этот файл и перенаправить stderr в файл.
Ожидалась функция завершения, но вместо этого получено:
Шаги воспроизведения:
zsh -f # Запуск чистого zsh без каких-либо rc файлов
autoload -U compinit
compinit
trial foo # Нажмите tab
Если я запускаю foobar foo<tab>
, ошибок нет, при этом обе команды trial
и foobar
не являются исполняемыми. Если это не исполняемый файл или отсутствует файл завершения, то должно происходить завершение пути к файлу, что именно я и хочу, но trial
кажется какой-то специальной командой, которая нарушает автозавершение? Обратите внимание, что trial
или _trial
отсутствуют в любом из директорий $fpath
.
Тестировалось на zsh 5.8 (x86_64-ubuntu-linux-gnu)
и zsh 5.9 (x86_64-apple-darwin23.0)
.
Это особенно проблема для кого-то, у кого действительно есть инструмент командной строки под названием trial
, и zsh просто выдает ошибки.
Это сообщение вызвано файлом определения завершения Completion/Unix/Command/_twisted
, из которого я цитирую:
Это файл завершения ZSH для команд Twisted. Он вызывает текущую командную строку с специальным параметром “–_shell-completion”, который обрабатывается twisted.python.usage. t.p.usage затем генерирует код zsh на stdout для обработки завершений для данной командной строки.
Таким образом, насколько я понимаю, для тех команд, которые определены здесь (т.е. twist, twistd, trial, conch, cftp, ckeygen, pyhtmlizer, tkconch) zsh пытается вызвать команду для генерации завершений на лету. Но если команда не установлена, это приведет к сбою, отсюда это загадочное сообщение об ошибке.
Наверное, два, может быть, три решения:
-
Установите команду
trial
. -
Удалите файл определения завершения
_twisted
. -
Отключите завершение для
trial
, выполняя:compdef -d trial
Последний вариант, кажется, наиболее целенаправленным, но это зависит от вашего конкретного случая.
Ответ или решение
Ошибка автозавершения, связанная с командой trial
, возникает из-за того, что Zsh пытается выполнить команду и сгенерировать код завершения на лету. Однако, если команда не установлена в системе, это приводит к ошибке, так как Zsh ожидает корректного определения функции завершения, но вместо этого получает сообщение об ошибке.
Причина, по которой вы видите сообщение об ошибке «Completion error running command: "trial"», заключается в том, что файл определения завершения Completion/Unix/Command/_twisted
пытается вызвать команду trial
с опцией --_shell-completion
. Если trial
отсутствует, это вызывает неудачу и, как следствие, появление указанной ошибки.
Возможные решения:
-
Установите команду
trial
.
Если командаtrial
вам нужна, убедитесь, что она установлена в вашей системе. Это можно сделать с помощью менеджеров пакетов, таких какpip
, еслиtrial
является частью Python-пакета Twisted.pip install Twisted
-
Удалите файл определения завершения
_twisted
.
Если вы не планируете использовать команды Twisted, вы можете удалить файл завершения_twisted
. Это решение окажется более радикальным и исключит любые другие проблемы, связанные с этим файлом.Обычно файлы определений завершения находятся в директории
Completion/Unix/Command/
. Найдите и удалите_twisted
. -
Отключите завершение для команды
trial
.
Если вам нужно сохранить другие функции завершения, вы можете просто отключить автозавершение для командыtrial
. Для этого выполните следующую команду в вашей оболочке Zsh:compdef -d trial
Это решение наиболее целенаправленное и позволяет избежать ошибок, не влияя на другие функции автозавершения.
Заключение
Выбор среди предложенных решений зависит от ваших потребностей. Если вы регулярно работаете с trial
, установите его. Если нет — закройте эту проблему с помощью одного из двух других вариантов. Убедитесь, что после внесения изменений вы перезапустили оболочку Zsh или обновили её конфигурации, чтобы изменения вступили в силу.