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