Оказывается, что откат вывода compgen
из скрипта python имеет тот недостаток, что он не экранирован.Таким образом, если пользователь пытается заполнить имя файла, например a/b/c d.txt
, командная строка изменится с:
./script.py a/b/c\ d.txt
на
./script.py a/b/c d.txt
после нажатия вкладки.Другие расширения тоже ломаются. Встроенный complete
предлагает запасной вариант , однако:
complete -C './script.py --compgen "$@"' -o default ./script.py
# ^^^^^^^^^^
Что это значит, сказать завершить, чтобы сначала попробовать часть -C
, и если эта часть возвращает ноль совпадений, оназапрашивает завершение по умолчанию, которое затем выполняет разрешение имени файла и т. д.
Я обнаружил, что можно даже принудительно завершить, чтобы не предлагать никаких предложений, возвращая в качестве предложения именно пустую строку.Это предотвращает запуск аварийного отката, но также не считается фактическим предложением для завершения, поэтому не учитывает пустую строку.