Автоматизация интерактивной работы

Как можно было заметить в примерах предыдущего раздела, для выполнения большинства действий в командной строке оболочки требуется ввод разнообразных команд, часто с множеством опций и аргументов, требующих подчас указания длинных путей к исполняемым файлам и файлам данных. Однако оболочка bash располагает тремя базовыми средствами автоматизации, делающими интерактивную работу в командной строке простой и легкой. И к тому же избавляющей от необходимости запоминать целиком команды и полные пути к файлам. Это автодополнение команд и путей, история команд и редактирование командной строки.

Чтобы воспользоваться свойством автодополнения, достаточно набрать один или несколько первых символов команды и нажать клавишу табуляции Tab. Если введенных символов хватает для однозначного определения команды, недостающие будут добавлены автоматически. Если нет — последует звуковой сигнал, после которого вторичное нажатие клавиши Tab выведет на экран список совпадающих с шаблоном команд, из которых можно выбрать требуемую в данном случае.

Иногда количество команд, отвечающих заданному шаблону, оказывается довольно большим, и тогда задается вопрос, выводить ли все команды из такого-то их количества, или нет. Просматривать столь длинные списки команд на экране неудобно и потому обычно лучше ввести еще один или несколько уточняющих символов.

Как уже говорилось выше, нажатие клавиши табуляции при пустой командной строке выведет полное количество команд, доступных системе в соответствии с переменной окружения $РАТН, о которой будет сказано в разделе про настройку оболочки.

Автодополнение применяется не только по отношению к командам, но и к путям файлов, используемым в качестве их аргументов, как абсолютным, так и относительным. Действие его аналогично: набирается некоторое количество начальных символов пути в абсолютной (начиная с символа /) или относительной (без него) форме и нажимается клавиша Tab|. Если их окажется недостаточно, следует либо ввести дополнительные символы для уточнения, либо, после повторного нажатия клавиши Tab|, выбрать подходящий вариант из списка.

К сожалению, свойство автодополнения не распространяется на опции команд, например, напрасно было бы пытаться, набрав

Is --he

использовать табулятор для получения справки по команде Is. Не удается использовать автодополнение также для имен команд, используемых как аргументы команды man.

Второй способ автоматизации ввода обеспечивается свойством bash хранить историю введенных команд в количестве, определяемом ее настройками. В дистрибутиве ASPLinux по умолчанию оно равно 1000.

Для просмотра истории команд существует одноименная внутренняя команда оболочки — history . Она выводит на экран нумерованный список всех вводившихся команд примерно следующего вида:

997 startx

998 less admin.txt

999 less user.txt

1000 find / -name locate -print &

1001 logout

1002 joe hist.txt

1003 history

Любая из нихможет быть исполнена повторно, для чего требуется, определив ее номер, ввести его в командной строке, предварив символом ! без пробела между ним и номером, например,

!1000

повторит поиск файла locate , определенного как аргумент команды find . Вместо номера после символа ! можно указать один или несколько символов из начала имени требуемой команды. В приведенном примере команда !j вызовет текстовый редактор joe для редактирования файла hist.txt , а команда !s запустит сеанс X Window System, то есть наиболее поздние из совпадающихс шаблоном.

Если введенные символы совпадают более чем с одной командой из истории, будет исполнена последняя по списку. Скажем, при введении команды !l из приведенного выше списка будет выполнена команда logout , если же задать в командной строке !le , повторится просмотр командой less файла user.txt , но не admin.txt .

Хотя количество команд, хранимых в истории, составляет, как уже говорилось, 1000, для непосредственного просмотра ихчерез пролистывание экранного буфера (посредством комбинации клавиш Shift + PageUp ) доступна лишь часть их, зависящая от размера буфера, что определяется не настройками оболочки bash , а свойствами консоли Linux. Однако есть и другие способы доступа к истории команд.

Наиболее простой, хотя и наименее эффективный из них, — это просмотр истории команд с помощью клавиш управления курсором Up и Down (вызывающих, соответственно, предыдущую и последующую команды). Эквивалентные им комбинации клавиш — Ctrl + P (от previous ) и Ctrl + N (от next ) соответственно. Кроме того, комбинацией клавиш Alt + < можно перейти к первой команде из сохраненных в истории, а Alt + > — к последней. Однако при обширной истории команд любая из этихпроцедур может быть весьма длительной.

Наконец, комбинация Ctrl|+|~r~|обеспечивает прогрессивный поиск нужной команды в истории команд по одному или нескольким составляющим ее символов. Выполняется поиск следующим образом: после нажатия указанной клавишной комбинации появляется предложение ввести часть искомой строки:

(reverse-i-search)’:

Последовательный ввод символов выведет последнюю из команд, ихсодержащую. Введенные символы не обязательно должны входить в имя команды, а могут быть составляющими ее опций или аргументов (имени файла или пути к нему, например). Следующее нажатие Ctrl|+pRT|переведет курсор к следующему элементу истории, содержащему введенные символы.

Например, если команда history вывела на экран список следующего вида:

1005 cd cur/aspbooks/

1006 less admin.txt

1007 lynx index.htm

1008 logout

1009 less user.txt

1010 Is -1

1011 history

и если после нажатия Ctrl|+pRT|для поиска задать символ 1

(reverse-i-search)’: 1 первой будет найдена команда

(reverse-i-search)’: Is -l

с фиксацией курсора на опции 1. При повторном нажатии Ctrl|+|~r~|курсор переместится в начало команды Is, при следующем будет выведена команда

(reverse-i-search)’: less user.txt

далее

(reverse-i-search)’: logout (reverse-i-search)’: lynx index.htm

и, наконец,

(reverse-i-search)’: less admin.txt

Нажатие клавиши Enter в любой из этихмоментов запускает найденную команду на исполнение. Поиск обрывается также и при нажатии любыхиных клавиш или ихкомбинаций, либо поиск продолжается дальнейшим нажатием

Ctrl|+pRT|.

Все сказанное выше относилось к тем случаям, когда требовалось повторить ранее использовавшуюся команду в неизменном виде. Более частой, однако, является ситуация, когда необходимо повторить команду, изменив некоторые из ее опций и (или) аргументов. На этот случай в bash предусмотрено свойство редактирования командной строки.

Разумеется, в любой выбранной из истории команде можно просто удалить (клавишей BackspaceI) все символы вплоть до того, который требует изменения, заменить его и ввести все заново. Однако есть и более целесообразные с точки зрения экономии усилий способы.

Навигация внутри введенной команды, ее опций и аргументов возможна с помощью клавиш управления курсором — клавиша Left перемещает его на один символ влево, клавиша Right — на один символ вправо, Home — в начало строки, End — в ее конец. Для редактирования символов, требующих изменения, можно использовать клавиши Del (удаление символа в позиции курсора) и Backspace (перед ней).

Однако есть возможность обойтись только алфавитно-цифровой частью клавиатуры в сочетании с управляющими клавишами Ctrl и Alt , что дает и более широкие возможности для навигации и редактирования. Например, комбинации клавиш (заметьте, что под точкой отсчета понимается текущая позиция курсора в строке):

Ctrl|+[B]

•(от back) перемещает курсор на один символ назад (аналогично клавише Left|),

Ctrl|+[F[

•(от forward) — на один символ вперед (подобно клавише Right I),

Alt|+|~B

•— назад к ближайшему пробелу, разделяющему опции и аргументы команды (или ближайшему символу в имени файла-аргумента, не являющемуся буквой или цифрой),

Altl+pF^I

•— вперед к ближайшему пробелу (или не буквенно-цифровому символу),

Ctrl|+[A|

•переводит курсор в начало строки,

Ctrl|+[E]

• — в ее конец.

Сходные комбинации используются и для редактирования командной строки.

Сочетание Ctrl|+|~D удаляет символ в позиции курсора, Ctrl|+|~H~|— перед ней, Alt|+D — часть строки до ближайшего справа пробела или точки, Ctrl|+[W~|— до ближайшего пробела слева. С помощью Ctrl\+K удаляется часть строки справа от позиции курсора. Alt|+[\] — аналогично Ctrl|+[H~|, но удаляются только пробелы.

Комбинацией клавиш Ctrl|+|~T~|осуществляется смена положения соседних символов (символ в позиции курсора перемещается налево, предыдущий занимает его место), комбинацией Alt|+|~T~| — смена положения последовательности символов («слов»), разделенныхпробелами или точками (по аналогичным правилам).

В разделах Commands for Moving, Commands for Changing Text и Killing and Yanking руководства по bash приведено еще множество команд для навигации по командной строке и редактирования ее. Предусмотрена даже функция отмены изменений (|Ctrll+-]), правда, только одноуровневая.

В целом команды навигации и редактирования в оболочке bash подобны аналогичным командам такихтекстовых ред:w акторов, как emacs и joe. Однако это положение по умолчанию можно изменить, и с помощью соответствующихнастроек сделать ихидентичными командам редактора vi.

Интересна возможность редактирования команд, найденныхв истории с помощью функции reverse-i-search (по комбинации Ctrl|+|~R~|). В ней можно изменить любые символы, пользуясь изложенными выше приемами. Однако, при этом редактируется не просто данная команда для последующего выполнения, а именно команда в истории. Если в приведенном выше примере в строке 1010

(reverse-i-search)’: ls -l

заменить опцию -l на, скажем, опцию -a, то при следующем просмотре командой history мы увидим за номером 1010 уже измененную команду:

1009 less user.txt

1010 ls -a

1011 history

Если же удалить команду целиком, в истории команд под этим номером останется пустое поле.

Еще материалы по теме: