bash: автодополнение (небольшое улучшение)

Полезные советы и программы от пользователей нашего форума.

Модератор: Модераторы разделов

Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU
Контактная информация:

bash: автодополнение

Сообщение sash-kan »

2 moderator: кажется, этот вопрос не поднимался (по крайней мере поиск не дал результатов). если это не так - топик можно смело удалять :)

как сделать так, чтобы 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. если такого файла нет в Вашем домашнем каталоге - смело создавайте новый :)

следует заметить, что обычно программой readline (которая, собственно, и обрабатывает ввод в командной строке) прочитываются оба инициализационных файла (и /etc/inputrc и ~/.inputrc), но только если не определена переменная окружения INPUTRC. в этом случае считывается только тот файл, на который она (переменная) указывает. узнать, определена ли эта переменная, и что в ней находится, можно с помощью команды
$ echo $INPUTRC
если Вы не администратор системы, а рядовой пользователь и администратором установлено значение для INPUTRC, например /etc/inputrc, то можно поступить следующим способом:
1. отредактируйте ~/.inputrc как описано выше.
3. в конце файла ~/.bash_profile добавьте строку
unset INPUTRC

удачи! будут вопросы - задавайте их на форуме или мне лично arizona2001@mail.ru

© alexander barakin aka sash kan
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
alv
Бывший модератор
Сообщения: 7275
Статус: Пенсионер в законе
ОС: Cintu
Контактная информация:

Re: bash: автодополнение

Сообщение alv »

(Ехидненько так:-)): а в zsh перебор вариантов по табулятору испокон веков по умолчанию существует:-))
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: bash: автодополнение

Сообщение t.t »

(alv @ Пятница, 22 Апреля 2005, 6:46) писал(а):(Ехидненько так:-)): а в zsh перебор вариантов по табулятору испокон веков по умолчанию существует:-))
Так об этом было написано.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга
Контактная информация:

Re: bash: автодополнение

Сообщение madskull »

Честно говоря, мне кажется это сомнительным преимуществом.
А если вариантов будет сотни? Да даже пара десятков?
Пример: я примерно помню как называется команда и набираю
$ mk<Tab><Tab>
и мне выводится список из примерно сорока названий. И я сразу (или почти сразу) нахожу то, что мне нужно.

А тут перебирай каждую команду... Да еще и проскочишь ненароком :)
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU
Контактная информация:

Re: bash: автодополнение

Сообщение sash-kan »

(ехидненько так :)
нет, конечно, работы по уникодизации zsh'а конечно начались... только вот когда закончатся?

(более серьезно)
вообще-то где возможно (админство, например), я пользуюсь zsh'ем (спасибо alv'у за великолепную пропаганду :).
а вот рядовому юзеру, сидящему под utf-локалью, да еще с всенепременным стремлением обозвать файлы
по-нашенски - лучше, все-таки bash.
а если прикрутить автодополнение по моему рецепту, так вообще... :)

(вообще серьезно)
протестировал только под fc1 и debian sarge. буду признателен за информацию по (не)удачному внедрению в
других дистрибутивах.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
alv
Бывший модератор
Сообщения: 7275
Статус: Пенсионер в законе
ОС: Cintu
Контактная информация:

Re: bash: автодополнение

Сообщение alv »

(Sash Kan @ Пятница, 22 Апреля 2005, 15:54) писал(а):(ехидненько так :)
нет, конечно, работы по уникодизации zsh'а конечно начались... только вот когда закончатся?

Что есть, то есть. Точнее, чего нет, того нет:-)
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: bash: автодополнение

Сообщение t.t »

(madskull @ Пятница, 22 Апреля 2005, 10:31) писал(а):Честно говоря, мне кажется это сомнительным преимуществом.
А если вариантов будет сотни? Да даже пара десятков?
Пример: я примерно помню как называется команда и набираю
$ mk<Tab><Tab>
и мне выводится список из примерно сорока названий. И я сразу (или почти сразу) нахожу то, что мне нужно.

А тут перебирай каждую команду... Да еще и проскочишь ненароком
Попробовал. Не проникся. Что-то до боли напомнило.. потом дошло -- виндовую cmd :) Действительно неудобно. А вот если кто подскажет, как сделать, чтобы список вариантов при неединственном варианте выскакивал по первому же табу, а не по второму, -- буду благода.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU
Контактная информация:

Re: bash: автодополнение

Сообщение sash-kan »

(t.t @ Пятница, 22 Апреля 2005, 20:49) писал(а):А вот если кто подскажет, как сделать, чтобы список вариантов при неединственном варианте выскакивал по первому же табу, а не по второму, -- буду благода.

а в чем будет измеряться "благода"? :))

а то вот решение-то есть:
добавить в /etc/inputrc или ~/.inputrc

set show-all-if-ambiguous On
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
alv
Бывший модератор
Сообщения: 7275
Статус: Пенсионер в законе
ОС: Cintu
Контактная информация:

Re: bash: автодополнение

Сообщение alv »

(t.t @ Пятница, 22 Апреля 2005, 20:49) писал(а):А вот если кто подскажет, как сделать, чтобы список вариантов при неединственном варианте выскакивал по первому же табу, а не по второму, -- буду благода.


А я разве не это имелось ввиду? Значит, недопонял. В zsh - именно так, по первому табу список, по второму - начинается перебор, ИМХО очень удобно. Правда, возможно про умолчание я загнул, м.б. это у меня так - не помню, то ли сам когда-то сделал, то ли из какой-то коллекции dot-файлов скоммуниздил, то ли действительно по дефолту так.
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: bash: автодополнение

Сообщение t.t »

(Sash Kan @ Пятница, 22 Апреля 2005, 21:11) писал(а):а в чем будет измеряться "благода"? :))
Будете в Киеве -- можно пивом :)
(Sash Kan @ Пятница, 22 Апреля 2005, 21:11) писал(а):а то вот решение-то есть:
Ща пропробуем. а может насчёт этого inputrc ман какой есть?
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU
Контактная информация:

Re: bash: автодополнение

Сообщение sash-kan »

(t.t @ Пятница, 22 Апреля 2005, 21:19) писал(а):Будете в Киеве -- можно пивом :)

пиво не пью, но намек понял :)
(t.t @ Пятница, 22 Апреля 2005, 21:19) писал(а):а может насчёт этого inputrc ман какой есть?

man|info bash|readline

Sash Kan добавил в 22.04.2005 22:30

кстати, мне такой параметр понравился
glob-complete-word
по умолчанию зашит на M-g. но работает только с упомянутым show-all-if-ambiguous On.
позволяет выводить список вариантов по паттерну. типа
$ ls /usr/*o
после этого нажимаю M-g и получаю
$ ls /usr/*o
doc info local
$ ls /usr/


Sash Kan добавил в 22.04.2005 22:46

остапа понесло :)
еще интересный момент.
параметр print-completions-horizontally.
если он включен (On), то список вариантов выводится отсортированным сначала по горизонтали,
а потом уже по вертикали.
при большом списке imho гораздо удобнее находить нужный пункт.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: bash: автодополнение

Сообщение t.t »

(Sash Kan @ Пятница, 22 Апреля 2005, 21:30) писал(а):пиво не пью, но намек понял :)
Значит, сговорились :)
(Sash Kan @ Пятница, 22 Апреля 2005, 21:30) писал(а):man|info bash|readline
Это я понимаю :) но по readline есть только man 3, а в info bash я чегой-то заблудился. Ну, подниму опять abs-guide :)
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU
Контактная информация:

Re: bash: автодополнение

Сообщение sash-kan »

(t.t @ Пятница, 22 Апреля 2005, 21:47) писал(а):Это я понимаю :) но по readline есть только man 3, а в info bash я чегой-то заблудился. Ну, подниму опять abs-guide :)

именно в man 3 readline и смотри. в info bash, по идее, все то же самое плюс специфика. по крайней мере в man bash именно так (это я про debian, в нем info bash вообще нет).
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: bash: автодополнение

Сообщение t.t »

(Sash Kan @ Пятница, 22 Апреля 2005, 22:08) писал(а):именно в man 3 readline и смотри.
Да? Мне показалось, там написано -- зависит от реализации. Сонный я. Утром ещё раз гляну.
(Sash Kan @ Пятница, 22 Апреля 2005, 22:08) писал(а):(это я про debian, в нем info bash вообще нет)
Ну как же.. :) А bash-doc?
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU
Контактная информация:

Re: bash: автодополнение

Сообщение sash-kan »

(t.t @ Пятница, 22 Апреля 2005, 22:14) писал(а):А bash-doc?

подразумевалось - у меня нет :)
мне с головой хватило man'а.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
azalio
Сообщения: 14
Контактная информация:

Re: bash: автодополнение

Сообщение azalio »

Не работает под фрей )
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU
Контактная информация:

Re: bash: автодополнение

Сообщение sash-kan »

(azalio @ Суббота, 23 Апреля 2005, 1:38) писал(а):Не работает под фрей )

т.е. вообще не воспринимается содержимое /etc/inputrc и ~/.inputrc?
или не работает только автодополнение?

p.s. а что, пользователи freebsd тоже bash'ем пользуются? я думал там гегемон - zsh :)
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
alv
Бывший модератор
Сообщения: 7275
Статус: Пенсионер в законе
ОС: Cintu
Контактная информация:

Re: bash: автодополнение

Сообщение alv »

(Sash Kan @ Суббота, 23 Апреля 2005, 9:54) писал(а):
(azalio @ Суббота, 23 Апреля 2005, 1:38) писал(а):Не работает под фрей )

т.е. вообще не воспринимается содержимое /etc/inputrc и ~/.inputrc?
или не работает только автодополнение?

p.s. а что, пользователи freebsd тоже bash'ем пользуются? я думал там гегемон - zsh :)



Там сплошная демократия, гегемона как класса нету. Но идеологически правильно в BSD пользоваться c-shell'ом:-))

Кстати, интересно, почему не работает. И главное - где? Чисто в консоли - вроде все должно работать. Или в терминальном окне?
Спасибо сказали:
Аватара пользователя
drakon
Сообщения: 211

Re: bash: автодополнение

Сообщение drakon »

Меня всегда напрягало, что после sudo не работает автодополнение при помощи [TAB]
Оказалось решается очень просто: достаточно раскоментировать вот эти строки в /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

проверенно в Debian
Debian GNU/Linux 2.6.15
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга
Контактная информация:

Re: bash: автодополнение

Сообщение madskull »

Сегодня на форуме opennet было вот такое улучшение (немного почикал):
Сообщение от jr
Оболочка tcsh, та что на FreeBSD по умолчанию, радовала меня такой фичей:
если набрать часть команды, например "cd /", и стрелками выбирать предыдущие вводимые команды из history, то будут выбираться только те, что начинаются на "cd /".

Сообщение от deadmoroz2
В /etc/inpurc добавь эти 2 строчки

"\e[A": history-search-backward
"\e[B": history-search-forward


Себе добавил, наверное понравится :)
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
drakon
Сообщения: 211

Re: bash: автодополнение

Сообщение drakon »

madskull только что попробовал. очень удобно!
Debian GNU/Linux 2.6.15
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: bash: автодополнение

Сообщение t.t »

/etc/bash_completion
Надо же, а я на него и не посмотрел. Хвалёное (Федорчуком, в частности) дополнение zsh'а в полной красе. Класс.

Сегодня на форуме opennet было вот такое улучшение (немного почикал):
Тоже весьма удобно. Раньше приходилось для этого пользоваться Ctrl+R, что всё же не совсем то.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
oberlicht
Сообщения: 381
Статус: Апатичный новичок
ОС: Slackware, Gentoo

Re: bash: автодополнение

Сообщение oberlicht »

sash-kan писал(а):
22.04.2005 22:11
а то вот решение-то есть:
добавить в /etc/inputrc или ~/.inputrc

set show-all-if-ambiguous On


У меня не работает..
Жму Tab - сразу начинает перебирать варианты. Список выводит, только если дважды Esc нажать..
Slackware 10.1 Bash 3.00.15(2)

/etc/inputrc был из двух строк:

set show-all-if-ambiguous On
TAB: menu-complete

Что же делать ?
Slackware 11 - 2.6.18 @ Athlon XP 1800+/512Mb
Slackware-12 - 2.6.21.5 @ Celeron D 2533/512Mb
Gentoo (amd64) - 2.6.22 @ Athlon X2 5600+/2048Mb
Спасибо сказали:
Аватара пользователя
vg2.0
Сообщения: 832
Статус: *BSD admin ;)
ОС: *BSD =)

Re: bash: автодополнение

Сообщение vg2.0 »

Не подскажите как в csh сделать вывод списка директорий по двойному tab, чтобы вывод одинарного tab'а остался.
По одинарному получилось так, set autolist, и исчезло автодополнение tab'а по одинарному нажатию.

Заранее спасибо.
FreeBSD 6-stable
FreeBSD 5.5-stable
Спасибо сказали:
Аватара пользователя
sergius
Сообщения: 782

Re: bash: автодополнение

Сообщение sergius »

Использую sudo, надоело постоянно писать полностью команды.
Например, надо выполнить команду ifconfig от рута.
Без sudo: #ifconfig
С sudo: $sudo ifconfig
Красным показано автодополнение по нажатию клавиши 'tab'.
Синим показано то, что я набираю.


Хочу, чтобы можно было написать так: $sudo ifconfig
Т.е. чтобы он мог продолжить команду.
Возможно?
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга
Контактная информация:

Re: bash: автодополнение

Сообщение madskull »

Должно работать.
Может, у тебя нет в путях этого ifcondig?
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
sergius
Сообщения: 782

Re: bash: автодополнение

Сообщение sergius »

В каких путях?
От рута все работает.
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: bash: автодополнение

Сообщение t.t »

В каких путях?
От рута все работает.
А путя у рута и у пользователя точно одинаковые? ;)
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
agent-mega
Сообщения: 505
Статус: Автономный модуль
Контактная информация:

Re: bash: автодополнение

Сообщение agent-mega »

t.t писал(а):
14.11.2005 18:37
В каких путях?
От рута все работает.
А путя у рута и у пользователя точно одинаковые? ;)

Кстати, дурацкий вопрос, а в каких файлах (для рута и для юзера) указывается PATH ?
DEBIAN & DEBIAN-BASED ONLY

Всё относительно. Объективности не существует.
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: bash: автодополнение

Сообщение t.t »

Кстати, дурацкий вопрос, а в каких файлах (для рута и для юзера) указывается PATH ?
Как и любая переменная окружения, может задаваться в любом файле, исполняемом при загрузке системы. Для пользователя традиционно в ~/.bash_profile.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Ответить