Опубликован: 14.12.2004 | Уровень: для всех | Доступ: платный | ВУЗ: Компания ALT Linux
Лекция 7:

Интерфейс

< Лекция 6 || Лекция 7: 1234 || Лекция 8 >

Редактирование командной строки и истории

Что еще можно счесть удобством при работе в командной строке? Редактирование самой строки. Вообще-то терминальная линия UNIX поддерживает минимальный набор операций с вводимой строкой: удаление последнего введенного символа (обычно ^H - клавиша Backspace или ^? - клавиша Delete ), удаление слова ( ^W ) и удаление всей строки ( ^U ). Однако, когда помногу работаешь в командной строке, начинаешь понимать, что этого недостаточно. Хочется, чтобы работали стрелочки вправо и влево (и прочие перемещения курсора внутри строки: на начало, на конец, по словам). Желательно также, чтобы Backspace удалял символ перед курсором, а Delete - после. Здесь появляется одна неприятная задачка, о решении которой в развернутом виде будет сказано в лекциях 8 и 15. Пока только обозначим ее: терминальное устройство (в IBM PC) вообще не обязано иметь стрелочек на клавиатуре. А если стрелочки есть, неизвестно, какие именно символы (ничего другого нельзя передать по терминальной линии) будет посылать в компьютер нажатие этих стрелочек. Точно так же дела обстоят со всеми небуквенными клавишами, включая Delete, Home, Page Down или F9. Что делать?

Первый вариант - не использовать их, задействовать управляющие последовательности вида ^B (backward), ^F (forward), ^A (начало строки), ^E (конец строки) и т. п. При этом, чтобы не множить сущности, надо сделать их такими же, как в текстовом редакторе, построенном по той же схеме взаимодействия с клавиатурой. Обычно эти команды совпадают с аналогичными в emacs (или info ). Или же ввести двухрежимный способ работы, как в редакторе ed или (что несколько сложнее) vi (см. главу 15), и пользоваться обычными символами как командами.

Второй подход - попробовать заданные emacs-style клавиатурные команды прикреплять к имеющимся на данном терминале клавишам. Для этого нужно заранее знать, какие именно символы посылает та или иная клавиша терминала, т. е. иметь некоторую базу данных терминалов и научить shell к ней обращаться. Такое прикрепление носит название binding и возможно только в современных версиях командных интерпретаторов.

Мы не упомянули о стрелочках вверх и вниз (и о соответствующих им emacs-style командах ^P, previous, и ^N, next) оттого, что они нужны уже не для простого редактирования, а для работы с историей команд. Часто бывает нужно вызвать предыдущую команду и отредактировать ее - например, чтобы исправить допущенную ошибку. Значит, предыдущую (а раз так, то и последнюю пару сотен) команду надо бы запоминать, записывать в файл, уметь вспоминать и т. д. Почти во всех shell есть команда !! - повторение предыдущей и !номер - повторение команды номер из файла истории. Однако пользоваться стрелочками для просмотра того файла привычнее и нагляднее, для чего ^P и ^N прикрепляют к "стрелке вверх" и "стрелке вниз".

Весьма удобно, если по файлу истории можно искать подстроку (например, чтобы восстановить точный синтаксис команды, про которую мы помним только, что она работала с файлом zoom.wing.txt ). Многие командные интерпретаторы позволяют просто нажать ^R, вписать zoom.wing.txt (или даже более короткую строку) и параллельно показывать подходящие записи из файла истории; а когда запись найдется, можно просто нажать Enter.

Сокращения

Если вы замечаете, что часто используете довольно длинную составную команду (например, ls -FACs или, в случае GNU ls, ls --classify --almost-all --color=auto ( команда man ls пояснит, что все это значит), может возникнуть желание ее укоротить. Как будет показано в лекции 11, можно написать короткую программу-сценарий на shell, назвать ее, скажем, l и запускать вместо полной строки. У этого метода есть три мелких недостатка, которые в сумме мешают пользователю поступать именно так. Во-первых, надо уметь обращаться с текстовым редактором быстро, иначе проще будет каждый раз набирать длинную строчку, чем заставить себя вписать ее в сценарий и затем использовать короткую. Во-вторых, для того, чтобы запускаемая команда выглядела как l, а не как /bin/sh /home/user/bin/l, надо выполнить ряд дополнительных действий, о которых следует знать (мы расскажем о них в лекции 10). В-третьих, для выполнения такой команды всякий раз будет запускаться отдельная копия командного интерпретатора.

Это само по себе при современных скоростях заметной нагрузки системе не прибавит (было 10 милисекунд, стало 100). Однако, если такую удобную команду использовать часто, различие между простым запуском утилиты и загрузкой shell, который в свою очередь запускает утилиту, может стать ощутимым: умножьте, например, числа в предыдущем примечании на 100. Первые два недостатка после трех месяцев работы в UNIX становятся несущественными.

Но зачем усложнять? Практически любой командный интерпретатор умеет запоминать сокращения (aliases) - заданные пользователем последовательности символов, которые будут заменяться на другие после того, как командная строка введена. Например, во многих случаях достаточно написать alias l="ls -FACs", после чего командный интерпретатор будет заменять l на ls -FACs, если l стоит в позиции имени команды (чаще всего - первое слово командной строки ).

Достраивание

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

$ ls prog*c
prog1.c program.cc  prographic  progr.c
$ vi progr.c

разработчики командного интерпретатора решили исключить из них "обезьянью" часть - переписывание имени файла с экрана. Пусть shell работает! Если мы, допустим, уже набрали часть команды vi_prog (утилита vi - мощный текстовый редактор, в лекции 15 рассказано, как с ним обращаться), то пускай теперь система покажет нам все возможные варианты продолжения этой команды (в данном случае - подходящие имена файлов в текущем каталоге ). Подаем интерпретатору специальную команду (обычно это клавиша Tab или ^D ), и, в зависимости от настроек, нам будет предложено выбрать один из файлов или просто подставится первое из подходящих имен (при этом повторное нажатие Tab покажет второе имя, и так по кругу). Такое свойство современных командных интерпретаторов называется достраиванием имен файлов (filename completion) . Это слегка расхолаживает пользователя, но позволяет экономить время на вводе команд.

Тактика достраивания может быть распространена на бесчисленное множество случаев: например, если мы написали cd d и просим shell достроить d до имени существующего файла, имеет смысл показывать подходящие имена одних только каталогов. Дальше - больше. Многие утилиты пользуются стандартным соглашением о формате команд и, в частности, поддерживают ключ -h или --help для вывода короткой подсказки. Можно попросить shell (если, конечно, это будет довольно "умный" shell, см. "Сравнительную таблицу командных интерпретаторов"), чтобы на ввод command " -- " и Tab он тайком запускал command --help и показывал результат в качестве подсказки, а не то сам разбирал этот результат и подставлял по очереди все ключи вида

--имя_ключа!
< Лекция 6 || Лекция 7: 1234 || Лекция 8 >
Andranik Avakian
Andranik Avakian

41. УК РФ и Комментарии (ст. 273)

М. 2000 г. Издательство: ALT Linux, Институт Логики

Уголовный Кодекс РФ и комментарии к нему?

По ссылке открывается сайт документации Linux, раздел Linux Installation and Getting Started

Сергей Петровский
Сергей Петровский

У Вас написано:

ls -dt1 `grep -il отчет *` | head -1

если знания по шелу мне не изменяют, то должно быть:

ls -dt | `grep -il отчет *` | head -1

Светлана Мишланова
Светлана Мишланова
Россия, Волгоград
Илдар Аллаяров
Илдар Аллаяров
Россия