<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.linuxformat.ru/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF123%3ADrBrown2</id>
		<title>LXF123:DrBrown2 - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF123%3ADrBrown2"/>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF123:DrBrown2&amp;action=history"/>
		<updated>2026-05-13T03:53:19Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.19.20+dfsg-0+deb7u3</generator>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF123:DrBrown2&amp;diff=10792&amp;oldid=prev</id>
		<title>Crazy Rebel: викификация, оформление</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF123:DrBrown2&amp;diff=10792&amp;oldid=prev"/>
				<updated>2010-09-22T09:21:59Z</updated>
		
		<summary type="html">&lt;p&gt;викификация, оформление&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==Телепатия в оболочке==&lt;br /&gt;
&lt;br /&gt;
: '''''Bash''''' Автодополнение – благо для тех из нас, кому трудно печатать аккуратно. Узнаем, как оно работает и как его расширить.&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Заголовок=Основы дополнения|Содержание=Дополнение&lt;br /&gt;
слов в ''Bash'' связано&lt;br /&gt;
с клавишей&lt;br /&gt;
'''Tab'''. Если&lt;br /&gt;
вы вводите&lt;br /&gt;
команду&lt;br /&gt;
и набрали,&lt;br /&gt;
скажем,&lt;br /&gt;
половину&lt;br /&gt;
имени&lt;br /&gt;
файла,&lt;br /&gt;
нажатие&lt;br /&gt;
'''Tab''' максимально&lt;br /&gt;
возможно&lt;br /&gt;
дополнит&lt;br /&gt;
введенную&lt;br /&gt;
строку&lt;br /&gt;
в текущем&lt;br /&gt;
контексте.&lt;br /&gt;
Нажатие&lt;br /&gt;
'''Tab Tab''' выведет&lt;br /&gt;
список&lt;br /&gt;
возможных&lt;br /&gt;
дополнений.&lt;br /&gt;
Можно&lt;br /&gt;
автоматически&lt;br /&gt;
дополнять&lt;br /&gt;
имена&lt;br /&gt;
команд,&lt;br /&gt;
файлов&lt;br /&gt;
и другие&lt;br /&gt;
аргументы&lt;br /&gt;
в зависимости&lt;br /&gt;
от контекста.&lt;br /&gt;
Это ответ&lt;br /&gt;
Linux на ''IntelliSence'' в ''Microsoft Visual Studio''. Типа&lt;br /&gt;
того.|Ширина=200px}}&lt;br /&gt;
&lt;br /&gt;
Из всех удобств ''Bash'' дополнение&lt;br /&gt;
имени файла – едва&lt;br /&gt;
ли&lt;br /&gt;
не самое&lt;br /&gt;
удобное&lt;br /&gt;
(если&lt;br /&gt;
вы не знаете,&lt;br /&gt;
что это, см. врезку). Честно&lt;br /&gt;
говоря,&lt;br /&gt;
без него, для удаления,&lt;br /&gt;
скажем,&lt;br /&gt;
'''sussen_0.90‑feisty-1_i386.deb''' мне пришлось&lt;br /&gt;
бы полдня&lt;br /&gt;
концентрироваться,&lt;br /&gt;
чтобы&lt;br /&gt;
набрать&lt;br /&gt;
все правильно.&lt;br /&gt;
Но недавно&lt;br /&gt;
я узнал,&lt;br /&gt;
что возможности&lt;br /&gt;
автодополнения&lt;br /&gt;
шире.&lt;br /&gt;
Это было&lt;br /&gt;
случайное&lt;br /&gt;
открытие.&lt;br /&gt;
Я набрал&lt;br /&gt;
нечто вроде&lt;br /&gt;
''sudo apt-get install'' и половины&lt;br /&gt;
имени пакета&lt;br /&gt;
и рассеянно&lt;br /&gt;
нажал&lt;br /&gt;
'''Tab''' – и вдруг увидел,&lt;br /&gt;
что ''Bash''&lt;br /&gt;
и вправду&lt;br /&gt;
дополнил&lt;br /&gt;
мою команду.&lt;br /&gt;
«Откуда, – удивился я, – ''Bash'' знает о программах, которые я хотел&lt;br /&gt;
бы установить?».&lt;br /&gt;
&lt;br /&gt;
Оказывается,&lt;br /&gt;
в ''Bash'' есть всесторонний&lt;br /&gt;
и расширяемый&lt;br /&gt;
механизм&lt;br /&gt;
дополнения.&lt;br /&gt;
Во-первых,&lt;br /&gt;
существует&lt;br /&gt;
встроенная&lt;br /&gt;
команда&lt;br /&gt;
''compgen'', которая&lt;br /&gt;
генерирует&lt;br /&gt;
различные&lt;br /&gt;
списки&lt;br /&gt;
завершения.&lt;br /&gt;
Частично они перечислены&lt;br /&gt;
в таблице в конце.&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
в действии:&lt;br /&gt;
если&lt;br /&gt;
набрать&lt;br /&gt;
''echo $E'' и нажать&lt;br /&gt;
'''Tab''', ''Bash''&lt;br /&gt;
дополнит&lt;br /&gt;
имя переменной&lt;br /&gt;
оболочки&lt;br /&gt;
«'''EUID'''» на основе&lt;br /&gt;
вывода&lt;br /&gt;
команды&lt;br /&gt;
''compgen -v''. Если&lt;br /&gt;
ввести&lt;br /&gt;
команду&lt;br /&gt;
''kill -H'' и нажать&lt;br /&gt;
'''Tab''',&lt;br /&gt;
''Bash'' дополнит&lt;br /&gt;
имя сигнала&lt;br /&gt;
«'''HUP'''» на основе&lt;br /&gt;
вывода&lt;br /&gt;
''compgen -A signal''.&lt;br /&gt;
&lt;br /&gt;
Правила&lt;br /&gt;
автодополнения&lt;br /&gt;
(называемые&lt;br /&gt;
«compspecs») добавляются&lt;br /&gt;
в оболочку&lt;br /&gt;
встроенной&lt;br /&gt;
командой&lt;br /&gt;
''complete''. При запуске&lt;br /&gt;
''Bash'' читает&lt;br /&gt;
файл '''/etc/bash_completion''', чтобы&lt;br /&gt;
получить&lt;br /&gt;
их&lt;br /&gt;
(данный&lt;br /&gt;
файл устанавливается&lt;br /&gt;
по умолчанию&lt;br /&gt;
не во всех дистрибутивах).&lt;br /&gt;
&lt;br /&gt;
Вот простой&lt;br /&gt;
пример&lt;br /&gt;
из этого&lt;br /&gt;
файла.&lt;br /&gt;
Строка&lt;br /&gt;
&lt;br /&gt;
 complete -f -X ‘!*.@(exe|EXE|COM|scr|SCR|exe/so)’ wine&lt;br /&gt;
&lt;br /&gt;
определяет&lt;br /&gt;
правила&lt;br /&gt;
для команды&lt;br /&gt;
''wine''. Здесь сказано: «Сгенерировать список имен файлов, затем исключить те, что не соответствуют ни одному из шаблонов». Согласно&lt;br /&gt;
этому&lt;br /&gt;
правилу,&lt;br /&gt;
''Bash''&lt;br /&gt;
будет&lt;br /&gt;
пытаться&lt;br /&gt;
дополнять&lt;br /&gt;
имена&lt;br /&gt;
файлов&lt;br /&gt;
для команды&lt;br /&gt;
''wine''. Данный&lt;br /&gt;
пример&lt;br /&gt;
просто&lt;br /&gt;
фильтрует&lt;br /&gt;
вывод&lt;br /&gt;
команды&lt;br /&gt;
''compgen -f''.&lt;br /&gt;
&lt;br /&gt;
===Сделать больше===&lt;br /&gt;
&lt;br /&gt;
Механизм&lt;br /&gt;
также&lt;br /&gt;
можно&lt;br /&gt;
расширить,&lt;br /&gt;
передав&lt;br /&gt;
ему либо&lt;br /&gt;
пользовательские&lt;br /&gt;
внешние программы,&lt;br /&gt;
либо&lt;br /&gt;
пользовательские&lt;br /&gt;
функции,&lt;br /&gt;
возвращающие&lt;br /&gt;
список&lt;br /&gt;
возможных&lt;br /&gt;
совпадений,&lt;br /&gt;
а затем&lt;br /&gt;
определив&lt;br /&gt;
их как правило&lt;br /&gt;
командой&lt;br /&gt;
''complete''.&lt;br /&gt;
&lt;br /&gt;
Вернемся&lt;br /&gt;
к той самой&lt;br /&gt;
команде&lt;br /&gt;
''apt-get'', которая&lt;br /&gt;
меня&lt;br /&gt;
удивила.&lt;br /&gt;
Мой файл '''bash_completion''' содержит&lt;br /&gt;
строку&lt;br /&gt;
&lt;br /&gt;
 complete -F _apt_get $filenames apt-get&lt;br /&gt;
&lt;br /&gt;
Она велит&lt;br /&gt;
''Bash'' использовать&lt;br /&gt;
функцию&lt;br /&gt;
'''_apt_get''' для генерации&lt;br /&gt;
списка&lt;br /&gt;
возможных&lt;br /&gt;
дополнений&lt;br /&gt;
команды&lt;br /&gt;
''apt-get''. Функция&lt;br /&gt;
определена&lt;br /&gt;
в одноименном&lt;br /&gt;
файле.&lt;br /&gt;
По существу,&lt;br /&gt;
она выполняет&lt;br /&gt;
команду&lt;br /&gt;
''apt-cache pkgnames'', чтобы&lt;br /&gt;
сгенерировать&lt;br /&gt;
возможный&lt;br /&gt;
список&lt;br /&gt;
совпадений.&lt;br /&gt;
Эта функция&lt;br /&gt;
длинновата для рассмотрения&lt;br /&gt;
здесь, поэтому&lt;br /&gt;
разработаем&lt;br /&gt;
пример&lt;br /&gt;
попроще.&lt;br /&gt;
&lt;br /&gt;
Его идея – в том, чтобы&lt;br /&gt;
добавить&lt;br /&gt;
дополнение&lt;br /&gt;
аргумента&lt;br /&gt;
для гипотетической&lt;br /&gt;
команды&lt;br /&gt;
''eat'', которая&lt;br /&gt;
принимает&lt;br /&gt;
как аргумент&lt;br /&gt;
наименование&lt;br /&gt;
пищи,&lt;br /&gt;
например,&lt;br /&gt;
''eat яблоко''. Я определил&lt;br /&gt;
функцию&lt;br /&gt;
'''_eat_complete''' для&lt;br /&gt;
создания&lt;br /&gt;
списка&lt;br /&gt;
возможных&lt;br /&gt;
блюд, а затем&lt;br /&gt;
использовал&lt;br /&gt;
команду&lt;br /&gt;
''complete -F'' для ее связи&lt;br /&gt;
с командой&lt;br /&gt;
''eat''.&lt;br /&gt;
&lt;br /&gt;
Вот определение&lt;br /&gt;
функции&lt;br /&gt;
и соответствующей&lt;br /&gt;
команды&lt;br /&gt;
''complete'':&lt;br /&gt;
&lt;br /&gt;
 _eat_complete()&lt;br /&gt;
 {&lt;br /&gt;
  cur=‘_get_cword’&lt;br /&gt;
  COMPREPLY=( $( compgen -W ‘абрикос апельсин банан&lt;br /&gt;
  яблоко’ -- $cur ))&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Вы видите,&lt;br /&gt;
что я просто&lt;br /&gt;
забил&lt;br /&gt;
в функцию&lt;br /&gt;
небольшой&lt;br /&gt;
список&lt;br /&gt;
вручную.&lt;br /&gt;
Более&lt;br /&gt;
жизненно&lt;br /&gt;
было&lt;br /&gt;
бы поместить&lt;br /&gt;
его в отдельный&lt;br /&gt;
файл '''/etc/foods''', затем&lt;br /&gt;
изменить&lt;br /&gt;
среднюю&lt;br /&gt;
строку&lt;br /&gt;
скрипта&lt;br /&gt;
на следующую:&lt;br /&gt;
&lt;br /&gt;
 COMPREPLY=( $( compgen -W ‘$(cat /etc/foods)’ -- $cur ))&lt;br /&gt;
&lt;br /&gt;
Куда&lt;br /&gt;
поместить&lt;br /&gt;
это код? Ну, я мог бы добавить&lt;br /&gt;
его в основной&lt;br /&gt;
файл&lt;br /&gt;
'''/etc/bash_completion'''. В порядке альтернативы,&lt;br /&gt;
можно&lt;br /&gt;
было&lt;br /&gt;
бы&lt;br /&gt;
поместить&lt;br /&gt;
его в отдельный файл в каталоге&lt;br /&gt;
'''/etc/bash_completion.d''',&lt;br /&gt;
и ''Bash'' найдет&lt;br /&gt;
его там. Тогда более&lt;br /&gt;
четко&lt;br /&gt;
разграничатся&lt;br /&gt;
системное&lt;br /&gt;
автодополнение&lt;br /&gt;
и мои игрушки.&lt;br /&gt;
Поэтому&lt;br /&gt;
я поместил&lt;br /&gt;
его в файл&lt;br /&gt;
'''/etc/bash_completion.d/eat'''. Потом – подумать&lt;br /&gt;
только! – ''Bash'' начнет автодополнять&lt;br /&gt;
аргументы&lt;br /&gt;
команды&lt;br /&gt;
''eat''. Конечно,&lt;br /&gt;
чтобы&lt;br /&gt;
подхватить&lt;br /&gt;
новое&lt;br /&gt;
правило,&lt;br /&gt;
нужно&lt;br /&gt;
запустить&lt;br /&gt;
новую&lt;br /&gt;
оболочку.&lt;br /&gt;
&lt;br /&gt;
Теперь,&lt;br /&gt;
когда я знаю секрет&lt;br /&gt;
работы&lt;br /&gt;
оболочки,&lt;br /&gt;
все это выглядит&lt;br /&gt;
уже не таким&lt;br /&gt;
волшебством.&lt;br /&gt;
Но от волшебства&lt;br /&gt;
я всегда&lt;br /&gt;
чувствовал&lt;br /&gt;
себя&lt;br /&gt;
как-то неуютно.&lt;br /&gt;
&lt;br /&gt;
===Параметры compgen===&lt;br /&gt;
&lt;br /&gt;
{|class=wikitable border=1 cellpadding=5|-&lt;br /&gt;
! Введя &lt;br /&gt;
! Вы получите&lt;br /&gt;
|-&lt;br /&gt;
| compgen -b &lt;br /&gt;
| Встроенные команды оболочки&lt;br /&gt;
|-&lt;br /&gt;
| compgen -d&lt;br /&gt;
| Каталоги&lt;br /&gt;
|-&lt;br /&gt;
| compgen -c&lt;br /&gt;
| Имена команд&lt;br /&gt;
|-&lt;br /&gt;
| compgen -f&lt;br /&gt;
| Имена файлов&lt;br /&gt;
|-&lt;br /&gt;
| compgen -s &lt;br /&gt;
| Имена служб&lt;br /&gt;
|-&lt;br /&gt;
| compgen -v&lt;br /&gt;
| Имена переменных оболочки&lt;br /&gt;
|-&lt;br /&gt;
| compgen -A signal&lt;br /&gt;
| Имена сигналов &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Узнать&lt;br /&gt;
леденящие&lt;br /&gt;
душу&lt;br /&gt;
подробности&lt;br /&gt;
можно&lt;br /&gt;
на man-страницах&lt;br /&gt;
''Bash'' для встроенных&lt;br /&gt;
команд&lt;br /&gt;
‘''complete''’ и ‘''compgen''‘&lt;/div&gt;</summary>
		<author><name>Crazy Rebel</name></author>	</entry>

	</feed>