Александр Баракин aka sash-kan, при участии коллективного разума Линуксфорума
Под редакцией Алексея Федорчука
Версия 2, 2005.11.25
Как сделать, чтобы bash при нажатии tab не выводил список возможных вариантов, а сразу подставлял их в командную строку?
Надеюсь, всем знакомо поведение bash по умолчанию, когда после ввода, например
$ pin
и нажатия клавиши tab выводится список возможных вариантов и вновь повторяется командная строка с набранными тремя буквами команды:
$ pin pinfo ping ping6 pinky $ pin
У вас список может отличаться.
А было бы совсем неплохо, если бы после нажатия tab в командной строке появилась бы первая из команд (pinfo), повторное нажатие tab заменило бы pinfo на ping, третье - на ping6 и т.д. Замечу здесь, что таким поведением по умолчанию обладает, например, zsh - правда, там первое нажатие табулятора также дает список вариантов, но со второго начинается их перебор. Научить bash данному "трюку" не просто, а очень просто :)
Вариант 1 - для всех пользователей.
Войдя в систему как суперпользователь root, отредактируйте файл /etc/inputrc, добавив в его конце строку:
TAB: menu-complete
Вариант 2 - для одного пользователя.
Если по каким-то причинам вы не можете/не хотите вносить изменения в общесистемный файл /etc/inputrc, можно вышеописанные манипуляции проделать с файлом ~/.inputrc. если такого файла нет в вашем домашнем каталоге - смело создавайте его. Например, таким образом:
$ echo 'TAB: menu-complete' > ~/.inputrc
Следует заметить, что обычно программой readline (которая, собственно, и обрабатывает ввод в командной строке) прочитываются оба инициализационных файла (и /etc/inputrc и ~/.inputrc), но только если не определена переменная окружения INPUTRC. В этом случае считывается только тот файл, на который она (переменная) указывает. узнать, определена ли эта переменная, и что в ней находится, можно с помощью команды
$ echo $INPUTRC
Если вы не администратор системы, а рядовой пользователь (и не имеете возможности получить привилегии root), а администратором установлено значение для INPUTRC, например /etc/inputrc, то можно поступить следующим способом:
отредактируйте ~/.inputrc как описано выше.
в конце файла ~/.bash_profile добавьте строку
unset INPUTRC
Есть решение и обратной задачи: чтобы список вариантов выводился по первому же нажатию табулятора, а не по второму: добавить в /etc/inputrc или ~/.inputrc сторку
set show-all-if-ambiguous On
Кстати, при наличии этой строки можно включить еще и такой полезный параметр, как
glob-complete-word
привязанный по умолчанию к комбинации Alt+G. Он позволяет выводить список вариантов по шаблонам типа
$ ls /usr/*o
После этого нажатие упомянутой комбинации дает список всех подкаталогов, содержащих в своем имени символ o:
doc info local
И еще интересный параметр -
print-completions-horizontally
Если он включен (значение On), то список вариантов выводится отсортированным сначала по горизонтали, а потом уже по вертикали, что при большом списке может быть удобнее.
Оболочка tcsh имеет такую особенность: если набрать часть команды, например cd /, и стрелками выбирать предыдущие вводимые команды из history, то будут выбираться только те, что начинаются на cd /. Чтобы добиться того же эффекта в bash, нужно в файл /etc/inpurc добавить такие строки:
"\e[A": history-search-backward "\e[B": history-search-forward
В bash по умолчанию автодополнение клавишей табулятора не работает, например, после команды sudo. Однако решается эта задача очень просто: достаточно раскоментировать в /etc/bash.bashrc следующие строки:
# enable bash completion in interactive shells #if [ -f /etc/bash_completion ]; then # . /etc/bash_completion #fi
После этого автодополнение будет работать буквально везде, где только можно себе представить, например: bash [TAB] - автодополнение названия хоста или dpkg --sea [TAB] - получится dpkg --search.
Дополнительные сведения о настройке bash можно найти в статье Яна Макдональда Более продуктивная работа с bash 2.x.