Настройка bash: дополнительные возможности табулятора

Александр Баракин aka Sash Kan
Под редакцией Алексея Федорчука

2005-07-26

Как сделать, чтобы 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), то список вариантов выводится отсортированным сначала по горизонтали, а потом уже по вертикали, что при большом списке может быть удобнее.