<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/css" href="http://wiki2.linuxformat.ru/skins/common/feed.css?97"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wiki2.linuxformat.ru/index.php?action=history&amp;feed=atom&amp;title=LXF113-114%3Abash</id>
		<title>LXF113-114:bash - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://wiki2.linuxformat.ru/index.php?action=history&amp;feed=atom&amp;title=LXF113-114%3Abash"/>
		<link rel="alternate" type="text/html" href="http://wiki2.linuxformat.ru/index.php?title=LXF113-114:bash&amp;action=history"/>
		<updated>2026-05-13T21:00:02Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.11.1</generator>

	<entry>
		<id>http://wiki2.linuxformat.ru/index.php?title=LXF113-114:bash&amp;diff=12866&amp;oldid=prev</id>
		<title>Ewgen: добавлены категории</title>
		<link rel="alternate" type="text/html" href="http://wiki2.linuxformat.ru/index.php?title=LXF113-114:bash&amp;diff=12866&amp;oldid=prev"/>
				<updated>2011-10-28T20:23:58Z</updated>
		
		<summary type="html">&lt;p&gt;добавлены категории&lt;/p&gt;

			&lt;table style=&quot;background-color: white; color:black;&quot;&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
			&lt;tr&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 20:23, 28 октября 2011&lt;/td&gt;
			&lt;/tr&gt;
		&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 135:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 135:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;'''Ctrl+T''' и '''Alt+T''' меняют местами символы и слова, соответственно. Заменяется символ/слово до курсора на символ/слово после курсора. К сожалению, в некоторых терминалах (например, ''Gnome Terminal''), '''Alt+T''' уже занят, так что это может у вас не сработать.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;'''Ctrl+T''' и '''Alt+T''' меняют местами символы и слова, соответственно. Заменяется символ/слово до курсора на символ/слово после курсора. К сожалению, в некоторых терминалах (например, ''Gnome Terminal''), '''Alt+T''' уже занят, так что это может у вас не сработать.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;[[Категория:Hardcore Linux]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;[[Категория:Bash]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;[[Категория:Джульетта Кемп]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Ewgen</name></author>	</entry>

	<entry>
		<id>http://wiki2.linuxformat.ru/index.php?title=LXF113-114:bash&amp;diff=9478&amp;oldid=prev</id>
		<title>Crazy Rebel: викификация, оформление,</title>
		<link rel="alternate" type="text/html" href="http://wiki2.linuxformat.ru/index.php?title=LXF113-114:bash&amp;diff=9478&amp;oldid=prev"/>
				<updated>2010-01-14T11:53:57Z</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;: '''Hardcore Linux''' Проверь себя на крутом проекте для продвинутых пользователей&lt;br /&gt;
&lt;br /&gt;
==Bash: Оболочка может больше==&lt;br /&gt;
&lt;br /&gt;
: Продвинутые пользователи Linux частенько сидят в оболочке ''Bash''. '''Джульетта Кемп''' сделает их общение с командной строкой проще и эффективнее.&lt;br /&gt;
&lt;br /&gt;
Вы наверняка уже поднакопили псевдонимов («алиасов») в вашем файле '''.bashrc''' – это укороченные варианты часто используемых команд. Псевдонимам, правда, нельзя передать «внутрь» аргументы из командной строки (по крайней мере, в ''Bash'' и связанных с ним оболочках). Функции позволяют вам это сделать, и вы сможете еще более минимизировать свой ввод команд.&lt;br /&gt;
&lt;br /&gt;
Чтобы чуть ускорить поиск по LDAP, можно использовать &lt;br /&gt;
&lt;br /&gt;
 function lds() { ldapsearch “($1=$2)”; }&lt;br /&gt;
&lt;br /&gt;
в командной строке или в вашем '''.bashrc'''. Затем наберите&lt;br /&gt;
&lt;br /&gt;
  lds cn jkemp&lt;br /&gt;
&lt;br /&gt;
и вы выполните поиск в LDAP всех записей с '''cn''', равной '''jkemp''' ('''ldapsearch “(cn=jkemp)”'''). Это здорово сокращает набор, и не надо держать в голове, что идет первым – '''“''' или '''('''.&lt;br /&gt;
&lt;br /&gt;
Функции могут делать почти все, на что способны скрипты – в том числе, быть сложными и саморекурсивными. Следующий код перемножает серию чисел произвольной длины (например, ''times 3 4 5'' выведет '''60'''). Учтите необходимость использования левого слэша перед '''*''' в строке вызова expr; без этого командная строка будет воспринимать '''*''' как список всех файлов вместо оператора умножения.&lt;br /&gt;
&lt;br /&gt;
  function times() {&lt;br /&gt;
  if [ -z “$2” ]; then&lt;br /&gt;
  echo $1&lt;br /&gt;
  else&lt;br /&gt;
  a=$1&lt;br /&gt;
  shift&lt;br /&gt;
  b = `times $@`&lt;br /&gt;
  echo `expr $a \* $b`&lt;br /&gt;
  fi&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
===Расширяем автодополнение===&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Заголовок=Скорая помощь | Содержание='''''shopt -s cdspell''''' исправит мелкие ошибки в команде ''cd'', что может очень пригодиться, если ваш ввод с клавиатуры несколько неряшлив.| Ширина=200px}}&lt;br /&gt;
&lt;br /&gt;
Другой трюк, с которым вы уже знакомы – нажатие '''Tab''' для автодополнения имен файлов и команд. Шикарно; но есть пара способов сделать&lt;br /&gt;
его еще шикарнее. Первый из них – не совсем автодополнение, но поможет вам быстрее находить каталоги. '''$CDPATH''' для ''cd'' выполняет&lt;br /&gt;
такую же роль, как и '''$PATH''' для исполняемых файлов. Иными словами, для каталога в вашем '''$CDPATH''' вы можете ввести только его имя, и ''Bash'' перенесет вас прямо туда, сэкономив на вводе полного пути.&lt;br /&gt;
&lt;br /&gt;
Допустим, мне постоянно надо попадать в поддиректорию '''research''' моего web-сайта. Мой '''$CDPATH''' выглядит так:&lt;br /&gt;
&lt;br /&gt;
  .:/home/jkemp:/local/www/html/research&lt;br /&gt;
&lt;br /&gt;
Просто ввожу ''cd research'' – и я там. Имейте в виду, что нужно включить начальную точку ('''.''') в '''$CDPATH''', иначе вы не сможете перейти в поддиректории без ввода '''./''' перед их именем.&lt;br /&gt;
&lt;br /&gt;
Однако это может вызвать проблемы, если я захочу перейти в поддиректорию с именем '''research-notes'''. Если, находясь в ее родительской директории, я наберу '''research''' и без оглядки нажму '''Tab''' и '''Enter''', то нечаянно угожу в '''/local/www/html/research'''. Чтобы эффективно использовать этот механизм, необходимо быть внимательными!&lt;br /&gt;
&lt;br /&gt;
===Программируемые завершения===&lt;br /&gt;
&lt;br /&gt;
Итак, '''$CDPATH''' – вещь полезная. Однако серьезным улучшением обычного автодополнения является программируемое завершение. Вы и&lt;br /&gt;
сами можете написать все необходимые вам функции завершения, но чтобы заново не «изобретать велосипед», рекомендую скачать '''/etc/bash_completion''' с http://www.caliban.org/bash (также доступного как пакет в большинстве дистрибутивов) и затем перенести код этого файла в ваш '''.bashrc''' (со строкой '''source /etc/bash_completion''').&lt;br /&gt;
&lt;br /&gt;
Сделали? Хорошо. Откройте новое окно терминала и попытайтесь набрать ''ssh'' в строке ввода команды, а потом нажмите '''Tab'''. Вы должны&lt;br /&gt;
увидеть список хостов, к которым вы можете захотеть обратиться по ''ssh'', обычно базирующийся на вашем файле '''known_hosts'''. Такое умеет куча других команд – попробуйте, например, ''traceroute'' или ''ftp''.&lt;br /&gt;
&lt;br /&gt;
А не украсить ли этот механизм автодополнением хоста в наших собственных скриптах? Заглянув в '''/etc/bash_completion''', вы увидите кучу подпрограмм, начинающихся с подчеркивания (например, '''_known_hosts'''), а затем строку такого вида:&lt;br /&gt;
&lt;br /&gt;
 complete -F _known_hosts traceroute ping telnet host ssh&lt;br /&gt;
&lt;br /&gt;
Если вы хотите добавить свою команду в этот список, допишите ее в конец после ''ssh'', пересохраните файл, и все должно заработать.&lt;br /&gt;
&lt;br /&gt;
'''-F''' – опция, определяющая функцию для завершения: все, что возвращается функцией (в данном случае, '''_known_hosts'''), является возможным вариантом завершения. '''-С''' – похожая опция: она выполняет команду и принимает ее вывод как вариант завершения.&lt;br /&gt;
&lt;br /&gt;
Можно написать и собственную функцию завершения. Вот простейший образчик функции, которую можно добавить в '''/etc/bash_completion''' – она ищет имя хоста в LDAP:&lt;br /&gt;
&lt;br /&gt;
 _ldapcomplete() {&lt;br /&gt;
 COMPREPLY=()&lt;br /&gt;
 cur=${COMP_WORDS[COMP_CWORD]}&lt;br /&gt;
 output=`ldapsearch -Q “(&amp;amp;(cn=$cur*) (objectClass=ipHost))” cn |&lt;br /&gt;
 grep ^cn:`&lt;br /&gt;
 name=${output#* }&lt;br /&gt;
 COMPREPLY=( ${COMPREPLY[@]} $name )&lt;br /&gt;
 return 0&lt;br /&gt;
 }&lt;br /&gt;
 complete -F _ldapcomplete ssh&lt;br /&gt;
&lt;br /&gt;
Первая строка устанавливает значение, которое будет использоваться для завершения при возврате ('''COMPREPLY'''). Далее, '''$cur''' принимает значение, переданное в функцию, т.е. то, что уже было набрано в командной строке. Переменная '''COMP_WORDS''' установлена ранее&lt;br /&gt;
в '''/etc/bash_completion''' для использования всеми функциями. Таким образом, '''$cur''' – то, что мы пытаемся завершить.&lt;br /&gt;
&lt;br /&gt;
Строка '''ldapsearch''' просматривает записи в каталоге LDAP, чьи имена начинаются с введенных символов и которые относятся к объектам типа '''host''', а затем выдает всю выдернутую из LDAP информацию. '''$output''' будет выглядеть так:&lt;br /&gt;
&lt;br /&gt;
 cn: hostname&lt;br /&gt;
&lt;br /&gt;
что в нынешнем виде не совсем хорошо для завершения. Поэтому следующая строка расчленяет ее на пробеле и берет вторую половину&lt;br /&gt;
'''$output''', содержащую только имя хоста. Это значение помещается в '''COMPREPLY''', и функция завершается. По сути, мы имеем дело только&lt;br /&gt;
с одним значением, поэтому строка может быть такой:&lt;br /&gt;
&lt;br /&gt;
 COMPREPLY=$name&lt;br /&gt;
&lt;br /&gt;
Но для соответствия остальному файлу и ради возможности дальнейшего совершенствования мы рассматриваем его как массив.&lt;br /&gt;
&lt;br /&gt;
Чтобы воспользоваться функцией, необходима вся строка '''-F _ldapcomplete ssh''': она скажет оболочке, что при использовании ''ssh''&lt;br /&gt;
эту функцию нужно применить для завершения имени хоста. Я уже упомянула о серьезном недостатке '''_ldapcomplete()''': она не рассматривает нескольких вариантов возврата и будет успешно работать только тогда, когда автодополнение LDAP возвращает одно значение (в противном случае возникают ошибки). Вот вам шанс немного поэкспериментировать; попробуйте исправить ее, чтобы она правильно обрабатывала несколько возвращаемых значений.&lt;br /&gt;
&lt;br /&gt;
===Возврат в историю===&lt;br /&gt;
&lt;br /&gt;
Предыстория ''Bash'' очень полезна: она избавляет от труда по запоминанию сложных команд. Нажатие '''Ctrl+R''' вызовет поиск вглубь вашей&lt;br /&gt;
истории команд (так, чтобы найти нечто с именем файла, начинающегося с '''dsl''', наберите '''dsl''' и нажмите '''Ctrl+R'''), а при помощи стрелок курсора вы будете двигаться по истории вспять, строка за строкой.&lt;br /&gt;
&lt;br /&gt;
Однако при поиске в предыстории очень раздражает наличие нескольких идентичных команд. Попробуйте применить такую настройку:&lt;br /&gt;
&lt;br /&gt;
  export HISTCONTROL=ignoreboth&lt;br /&gt;
&lt;br /&gt;
и игнорировать серии одинаковых команд в вашей предыстории. Эта переменная может принимать другие значения: '''erasedups''' удалит все&lt;br /&gt;
лишние команды, а не просто проигнорирует их последовательности, а '''ignorespace''' пропустит строки, начинающиеся с пробелов.&lt;br /&gt;
&lt;br /&gt;
Если вам часто приходится открывать одновременно несколько окон терминала, попробуйте добавить в файл '''.bashrc''' строку&lt;br /&gt;
&lt;br /&gt;
  shopt -s histappend&lt;br /&gt;
&lt;br /&gt;
Она заставит множественные оболочки записывать историю в один и тот же файл – это позволит избежать проблемы, когда при выходе из&lt;br /&gt;
множества оболочек вы получаете историю лишь последней. Вы также можете расширить вашу историю с помощью строки&lt;br /&gt;
&lt;br /&gt;
  export HISTSIZE=1000000 HISTFILESIZE=1000000&lt;br /&gt;
&lt;br /&gt;
так у вас появится доступ к гораздо более долгой предыстории команд.&lt;br /&gt;
&lt;br /&gt;
Как видите, в ''Bash'' куда больше возможностей, чем вы думали. Стоит потратить время на чтение соответствующих ''man''-страниц – они&lt;br /&gt;
на удивление легко читаются. Не прекращайте изучать новые возможности, обретая опыт в использовании оболочки! '''LXF'''&lt;br /&gt;
&lt;br /&gt;
===Немного «горячих клавиш» ''Bash''===&lt;br /&gt;
&lt;br /&gt;
'''Ctrl+R''' and '''Ctrl+S''' Инкрементный поиск назад и вперед, соответственно, в предыстории команд.&lt;br /&gt;
&lt;br /&gt;
'''Ctrl+J''' и '''Ctrl+G''' Эти команды прекращают инкрементный поиск, заменяя его результатом или исходной строкой, соответственно.&lt;br /&gt;
&lt;br /&gt;
'''Alt+.''' или '''ESC''' потом '''.''' (точка). Обе добавляют последний аргумент предыдущей команды в место расположения курсора. Полезно при перемещении файлов и их редактировании.&lt;br /&gt;
&lt;br /&gt;
'''Ctrl+A''' и '''Ctrl+E''' Переход на начало и конец командной строки, соответственно.&lt;br /&gt;
&lt;br /&gt;
'''Alt+C+Y''' Вставка первого аргумента предыдущей команды у места расположения курсора. Если нужен n-й аргумент, сперва нажмите '''Alt+N'''. Так, '''Alt+2 Alt+C+Y''' даст вам второй аргумент предыдущей команды. Здесь много клавиш для запоминания, но иногда это бывает полезно.&lt;br /&gt;
&lt;br /&gt;
'''Ctrl+U''' Удалить все от позиции курсора до начала строки. Также работает при вводе паролей, так что используйте это сочетание,&lt;br /&gt;
если вы застряли на полпути и забыли место, на котором закончили. При желании снова использовать строку, нажмите '''C+Y'''.&lt;br /&gt;
&lt;br /&gt;
'''Ctrl+T''' и '''Alt+T''' меняют местами символы и слова, соответственно. Заменяется символ/слово до курсора на символ/слово после курсора. К сожалению, в некоторых терминалах (например, ''Gnome Terminal''), '''Alt+T''' уже занят, так что это может у вас не сработать.&lt;/div&gt;</summary>
		<author><name>Crazy Rebel</name></author>	</entry>

	</feed>