Я могу понять, что автоматическое завершение bash работает для стандартных утилит. Но как это сделать автозаполнение для пользовательских программ, таких как Oracle SQL Loader?
В следующей команде, если вы нажмете Tab после control=
этого, он автоматически заполняется до имени управляющего файла:
sqlldr kshitiz/oracle@XE control=data.ctl data=data.csv bad=data.bad log=data.log
Как он узнал, что должен заполнить контрольный файл в этот момент, а не какой-то другой файл?
bash
autocomplete
Кшитиз Шарма
источник
источник
/etc/bash_completion.d
. Посмотрите также/etc/bash_completion
и посмотритеset
, насколько выросла ваша среда.gdbus-bash-completion.sh
gvfs-bash-completion.sh
pk-completion.bash
yum.bash
. Выводset
такой же неинтересный./etc/profile.d
. Или, может быть, ваш.bash_profile
или.bashrc
был изменен.bash-completion
загружает дополнения динамически с тех пор1.90
. Попробуйте:sqlldr<space><tab><enter>
. Затем введитеcomplete -p sqlldr
.Ответы:
Программируемое завершение Bash работает путем анализа командной строки и выяснения того, что завершается:
$
завершается как имя переменной и т. Д.Например, после , bash завершает имена команд, начинающиеся с . После bash завершает имена переменных, которые начинаются с . После bash применяет правила завершения для команды . Правила завершения могут указывать категорию (пользователь, переменную, файлы и т. Д.), Шаблон подстановочного знака для имен файлов или функцию или фрагмент кода для выполнения.
sqllTab
sqll
sqlldr $aTab
a
sqlldr Tab
sqlldr
Правила завершения определяются
complete
встроенным. Bash не отслеживает, когдаcomplete
был вызван встроенный модуль или в каком скрипте (если он есть) он был. В большинстве дистрибутивов поставляется пакет завершения bash , который предоставляет ряд правил для общих команд. Это принимает форму ряда файлов сценариев, которые содержат вызовыcomplete
, со сценарием, который должен быть прочитан.bashrc
(или/etc/bash.bashrc
реализован) для загрузки всех этих сценариев: обычно. /etc/bash_completion
требуется для активации программируемого завершения и загрузки доступных сценариев.Стандартный пакет не включает поддержку
sqlldr
. Если у вас есть такая поддержка, она должна исходить из другого источника. Этот источник , возможно, уронил файл в каталоге , как/etc/bash_completion.d
и мог бы прийти с инструкциями , чтобы включить некоторый код в вашем.bashrc
. Вы можете использовать,complete -p sqlldr
чтобы увидеть текущие правила дляsqlldr
; как упоминалось ранее, это не скажет вам, откуда были загружены эти правила.Tcsh, zsh и fish имеют несколько схожих механизмов (все черпали вдохновение в tcsh), но имеют различные встроенные функции, синтаксис и возможности.
источник
complete
был вызван. Но вы можете найти имя исходного файла и номер строки, где определена функция завершения.complete -p sudo # outputs complete -F _sudo sudo
,shopt -s extdebug
,declare -F _sudo # outputs _sudo 3 /usr/share/bash-completion/completions/sudo
. (Но см. Мой комментарий о динамически завершающих загрузках иcomplete -p
).and the settings for the basename of the command are applied
, Нет. Вы можете иметь разные compspecs дляdate
и/bin/date
. Справочник гласит : Если командное слово является полным путем, сначала ищется compspec для полного имени пути. Если для полного пути не найден compspec, делается попытка найти compspec для части, следующей за последней косой чертой