Книга посвящена дистрибутиву Linux Mint и одной из его главных



Скачать 21.34 Mb.
Pdf просмотр
страница8/30
Дата22.11.2016
Размер21.34 Mb.
Просмотров2665
Скачиваний0
1   ...   4   5   6   7   8   9   10   11   ...   30
Навигация и редактирование
Имя команды, ее опции и аргументы образуют т.н. командные слова. В
качестве словоразделителей выступают пробелы. Кроме того, как разделители слов интерпретируется ряд специальных символов — прямой слэш (/) — элемент пути к файлу, обратный слэш (\), служащий для экранирования специальных символов, и операторы командных конструкций,
о которых будет сказано ниже.
В некоторых случаях имеет смысл различать большое слово и малое слово. Первые разделяются пробелами, в качестве же вторых интерпретируются символы, лежащие между всеми другими словоразделителями.
Подчеркнем, что командное слово прямо не соотносится ни с опциями, ни с аргументами команды. Введение этого понятия призвано просто облегчить навигацию в командной строке и ее редактирование.
Ибо одно из великих достижений командного интерфейса POSIX-систем,
заценить которое могут в полной мере только те, кто застал времена
«черного а, — это возможность перемещёния внутри командной строки и внесения необходимых изменений в имя команды, ее опции и аргументы.
Делается это различными способами.
Самый привычный и, казалось бы, очевидный способ — использование клавиш перемещёния курсора Left, Right, End и Home, действующих (хотя и не всегда) в командной строке точно также, как ив каком-нибудь ворд- процессоре для Windows (клавиши Up, Down, PageUp, PageDown зарезервированы для других целей. То есть они позволяют перемещаться на один символ влево и вправо. в начало и конец командной строки. А если добавить сюда ещё клавиши Delete и Backspace, позволяющие удалять символы в позиции курсора или передней то, казалось бы, чего ещё
желать?
Оказывается — есть чего, и самый очевидный способ навигации и редактирования оказывается не самым эффективным. Для начала заметим,
что в общем случае привычные клавиши перемещёния курсора и редактирования в системах не обязаны работать также, как они делают это в DOS/Windows. Это зависит от многих причин, в том числе и исторических.
Ведь системы по определению предназначены работать на любых практически машинах (в том числе и на тех, клавиатуры которых клавиш управления курсором просто не имели).
Однако это не главное — в большинстве дистрибутивов командная
оболочка по умолчанию настраивается так, чтобы пользователь при желании мог использовать привычные ему клавиши. Однако тут-то и оказывается, что плюс к этому оболочка предоставляет ему много более эффективную систему навигации по командной строке и ее редактирования. И это — система управляющих последовательностей, так называемых keybindings. То есть сочетания специальных клавиш, именуемых управляющими, с обычными алфавитно-цифровыми.
Управляющие последовательности
Основные управляющиеся клавиши, которые используются в таких последовательностях (и имеются на клавиатурах почти любых машин — как говорят в таких случаях, в любых типах терминалов) — это клавиши Control и
Meta.
Пардон — возразит внимательный читатель, — сколько я ни долблю по клавишам моей PC'шки, но клавиши Meta не замечал. Возражение принято, нона клавиатурах функции Meta выполняют либо а) нажатие и отпускание клавиши Escape, либо б) нажатие и удерживание клавиши Впрочем, к этой теме я ещё вернусь. А пока достаточно нескольких простых рецептов, практически универсальных для любых командных оболочек в терминалах любых типов.
Рецепт первый большая часть управляющих последовательностей состоит из сочетания клавиши Control и алфавитно-цифрового символа. Под сочетанием (или комбинацией, для чего я уже употреблял ранее символ плюс)
понимается то, что, удерживая нажатой клавишу Control, мы одновременно нажимаем и какую-нибудь литерную или цифровую.
Так, действие клавишной комбинации Control+F (отв большинстве случаев регистр алфавитной клавиши управляющей последовательности значения не имеет) эквивалентно нажатию клавиши — это перемещёние на один символ вправо, комбинации Control+B (от) — нажатию Left (перемещёние на один символ влево. Комбинации и Control+E действуют аналогично Home и End, перемещая курсор в начало и конец командной строки, соответственно, Ну ас помощью комбинаций Control+D и Control+H можно удалить единичный символ в позиции курсора или передней (также, как и клавишами Delete и Backspace,
соответственно).
Предвижу резонный вопроса какие достоинства в комбинации клавиш
Control+Что_то по сравнению с элементарными End или Left? Конечно, одно достоинство — очевидно при массовом вводе команда также, забегая вперед, замечу — и любых иных наборов символов, от исходных текстов до романов, при использовании keybindings руки не отрываются от основной
(алфавитно-цифровой) части клавиатуры. Ив итоге, по приобретении некоторого минимального навыка, дело движется ну гораздо быстрее.
Обосновать тестами не могу (тут какая-нибудь физиометрия понадобится, ноне верящим — предлагаю попробовать.
Главное же преимущество клавиатурных последовательностей перед стандартными навигационными клавишами — много более широкая их функциональность. Яне случайно начал этот параграф с упоминания командных слов — это, наряду с единичными символами, также навигационные (и, добавлю, редакционные) единицы командной строки. То
есть управляющие последовательности позволяют при навигации и редактировании оперировать не только единичными символами, но и целыми словами.
Например, комбинация Meta+F смещает курсор на одно слово вперед, та же Meta в сочетании сна одно слово назад, итак далее. Прошу обратить внимание действие алфавитной клавиши в комбинации с Meta сходно по смыслу ее сочетанию с клавишей Control, но как бы «усилено»:
последовательность Meta+D уничтожает не символ в позиции курсора, как это было бы для D в сочетании с Control, а все командное «слово».
Рассматривать ключевые последовательности подробно здесь я не буду:
детали их действия зависят от командной оболочки и ее настроек. Отмечу только два существенных обстоятельства. Первое keybindings предоставляют пользователю полный комплекс приемов для любых действий в командной строке — вплоть до преобразования регистров уже введенных символов и
«слов» (из нижнего в верхний и наоборот, перетасовки символов в команде или ее аргументах, итак далее.
Значение управляющих последовательностей не ограничивается командной строкой — большинство популярных в мире текстовых редакторов, от простых Nano или joe до грандиозного vim и монструозного emacs. построены потому же принципу. Так что навыки, полученные при работе с например, в Bash, весьма поспособствуют виртуозному освоению любого из этих инструментов.
И второе — действие ключевых последовательностей, как правило. не зависит не только от типа терминала и физического устройства клавиатуры,
но и от ее раскладки — при переключении на кириллицу они будут работать столь же справно, как ив латинице.
История команд
Возможности навигации и редактирования строки особенно ярко проявляются в сочетании с другой замечательной особенностью,
предоставляемой командными оболочками — доступом к истории команд. То есть раз введенная в строке команда не уходит в небытие после исполнения,
а помещается в специальный буфер памяти. Который, как и все в Unix'ах,
именуется весьма незатейливо — буфер истории команд. Откуда команда (со всеми её опциями и аргументами) может быть извлечена для повторного использования. Или — для редактирования и исполнения в новой реинкарнации.
Буфер истории команд сохраняется в течении всего сеанса работы. Однако в большинстве случаев командные оболочки настраиваются так, что по выходе из сеанса буфер истории сохраняется в специальном файле в домашнем каталоге пользователя, и таким образом его содержимое оказывается доступным при следующем запуске шелла. Имя этого файла может быть различным в разных оболочках, но обычно включает компонент history (в Bash — Так что, можно сказать, что введенным нами командам суждена вечная жизнь.
Конечно, не совсем вечная. И размер буфера истории команд, и количество строк в файле истории — величины конечные. Так что, если установленный предел превышен, то старые команды вытесняются более новыми. Однако и величину буфера, и количество строк в файле истории можно установить
любыми. Разумеется, в разумных пределах — не знаю, существует ли принципиальное ограничение на их размер, за исключением объёма памяти и дискового пространства. А если учесть, что и из буфера, и из памяти с помощью соответствующих настроек (со временем я расскажу, каких) можно исключить дубликаты и ещё кое-какой мусор — то мое заявление о вечной жизни команд не выглядит столь уж преувеличенным.
Универсальное средство доступа к буферу истории команд — специальная команда, встроенная вовсе шеллы, таковой поддерживающие — history (в большинстве дистрибутивов Linux она по умолчанию имеет псевдоним — Данная без опций, эта команда выводит полный список команд в их исторической (издревле к современности) последовательности, или некоторое количество команд, определенных соответствующими настройками (о которых будет говориться позднее).
В качестве опции можно указать желаемое количество одновременно выведенных команд. Например, директива history -2 выведет две последние команды из буфера истории вместе сих номерами joe shell.html
1024 less
/.zshrc Любая из команд в буфере истории может быть повторно запущена на исполнение. Для этого достаточно набрать в командной строке символ восклицательный знаки затем, без пробела — номер команды в списке буфера. Например !1023 для приведенного выше примера повторно откроет файл shell.html в текстовом редакторе Другой способ доступа к командам из буфера истории — комбинации клавиши, служащие для последовательного его просмотра (как бы «пролистывания») назад и, соответственно, вперед
(разумеется, если есть куда. Они дублируются клавишами управления курсором Up и Down (назад и вперед, соответственно. Кроме того,
последовательности Meta+< и Meta+&rt; обеспечивают переход к первой и последней команде в буфере истории.
Любая извлеченная (с помощью стрелок или управляющими последовательностями) из буфера истории в текущую строку команда может быть повторно запущена на исполнение — нажатием клавиши Enter или дублирующей ее комбинацией Control+M. причём предварительно ее можно отредактировать — изменить опции, или аргументы, — точно так же, как и только что введенную.
Поиск в истории
Во всех современных развитых шеллах предусмотрены средства поиска команды в буфере истории — простым перебором (обычно Meta+P — назад и — вперед).
Впрочем, несмотря на громкое название, обычный поиск ничем практически не отличается от пролистывания исторического списка курсорными стрелками. Что при обширной истории команд может быть весьма утомительным. И потому для ее облегчения предусмотрена такая интересная возможность, как наращиваемый поиск (incremental search) нужной команды в буфере истории по одному (или нескольким) из составляющих ее символов.
Выполняется инкрементный поиск так после нажатия (при пустой командной строке) клавишной комбинации Control+R появляется предложение ввести алфавитный символ (или — последовательность символов произвольной длины, заведомо входящий в состав требуемой команды bck-i-search: _ Ввод такого символа выведет последнюю из команд, его содержащих. При этом введенный символ будет отмечен знаком курсора. Он не обязан входить в имя команды, но может быть составляющим ее опций или аргументов
(имени файла или пути к нему, например. Следующее нажатие зафиксирует курсор на предыдущем символе, в пределах этой же или более ранней по списку команды, и т.д. Однако вместо этого в строке поиска можно вводить дополнительные символы, детализирующие условия поиска команды
(или — ее опций и аргументов).
Процедуру поиска можно продолжать вплоть до достижения требуемого результата — то есть нахождения той команды, которая нужна именно сейчас. Нажатие клавиши Enter в любой из этих моментов запускает найденную (то есть помещённую в командную строку) команду на исполнение, с завершением поиска. Поиск обрывается также и нажатием комбинации Control+C. Перед запуском найденная команда может быть отредактирована стандартными средствами — с использованием управляющих последовательностей.
Регулярные выражения
Как известно, все пользователи-POSIX'ивисты должны быть в обязательном порядке привержены одному из семи смертных грехов. И грех этот — леность,
можно сказать, показатель профессиональной пригодности линуксоида. В
соответствие со своей леностью разработчики систем придумывают способы, как бы им минимизировать свои усилия. А применители из лени изощряются в использовании этих приемов на практике. В частности — в том,
как свести к минимуму набор в командной строке.
Собственно говоря, этой цели служили почти все приемы, описанные выше.
Осталось осветить немногое. А именно — регулярные выражения,
реализуемые с помощью т.н. специальных символов (или метасимволов).
Элементарная, и весьма частая, в духе школьных, задача из каталога требуется скопировать все файлы в каталог dir2. Так неужели все они должны быть перечислены в качестве аргументов команды cp? Нет, нет, и ещё раз нет. Ибо для этой цели придуманы шаблоны имен файлов. Самый часто используемый из них — специальный символ * (вроде бы я о нем уже говорил. Он подменяет собой любое количество любых символов (в том числе — и нулевое, то есть отсутствие символов вообще. То есть для решения предложенной задачи нам достаточно дать команду:

$ cp dir1/* dir2 Чуть усложним условия к копированию из dir1 предназначены не все файлы, а только документы, традиционно имеющие суффикс Решение от этого не становится сложнее cp dir1/*html dir2 Однако тут можно вспомнить, что документы могут иметь и расширение htm. Не пропустим ли мы их таким образом при копировании?
Таким — безусловно, пропустим. Однако нам на помощь придет другой шаблон — символ ?. А соответствует он любому единичному символу (или его отсутствию, те. символу null). И значит, если команда из примера будет модифицирована таким образом cp dir1/*htm? dir2 то она гарантированно охватит всевозможные маски html-документов.
Вроде все хорошо. Однако нет из каталога dir1 нам нужно скопировать только три определенных файла — file1, file2, file3. Не придется ли каждый из них указывать в командной строке с полным путем (а ведь они могут быть ив глубоко вложенном подкаталоге типа dir1/dir11/dir111)? Все равно не придется, на столь хитрую. постановку задачи у насесть прием с левой резьбой — символы группировки аргументов, обозначаемые фигурными скобками. Что на практике выглядит так cp path/{file1,file2,file3} dir2 И приведет к единоразовому копированию всех трех файлов в каталог Заметим, что сгруппированные аргументы разделяются запятыми без пробелов. И ещё: в оболочке Bash группируемые аргументы придется полностью вводить руками. Но вот в Zsh на них распространяется возможность автодополнения, да и запятая после каждого имени появляется автоматически (и столь же автоматически исчезает при закрытии фигурной скобки).
Группировка аргументов может быть сколь угодно глубоко вложенной. Так,
команда
$ mkdir -p dir1/{dir11/{dir111,dir112},dir12/{dir121,dir122}} в один заход создаст трехуровневую структуру каталогов внутри текущего если только не забыть про опцию -p, которая предписывает создавать промежуточные подкаталоги в случае их отсутствия.
И ещё несколько примеров. Регулярное выражение для диапазона — то есть вида [...], подменяет любой из символов, заключенных в квадратные скобки.
Символы эти могут даваться списком без пробелов (например, выражение соответствует любому символу от 1 доили определяться в диапазоне, крайние значения которого разделяются дефисом без пробелов
(эквивалентное первому выражение — [1-5]). Кроме того, символ предваряющий список или диапазон, означает отрицание выражение подменяет любой символ, исключая символы a, b и Последние примеры регулярных выражений могут показаться
надуманными. Однако представим. что в том же каталоге dir1, кроме html- документов, содержатся также файлы изображений в различных форматах —
GIF, JPEG, TIFF итак далее (традиционно имеющие одноименные расширения).
И все они должны быть скопированы в каталога вот как раз файлы нам в данный момент без надобности. No problemas, как говорят у них cp dir1/*[^html] dir2 Ив каталоге dir2 окажется все содержимое каталога dir1, за исключением html-файлов.
Экранирование
Из приведённых примеров можно видеть, что метасимволы, образующие регулярные выражения, интерпретируются командной оболочкой особым образом, не так, как обычные алфавитно-цифровые символы, составляющие,
скажем, имена файлов.
В тоже время собственно системы накладывают на имена файлов очень мало ограничений. Ив принципе система не запретит вам создать файл с именем, содержащим метасимволы. Другое дело, что работать с таким образом именованными файлами может быть сложно — командная оболочка будет пытаться интерпретировать их в соответствии с правилами для регулярных выражений.
Конечно, использовать метасимволы в именах файлов весьма не рекомендуется. Однако а) возможны элементарные ошибки при наборе, и б)
файлы, полученные при обмене с другими операционными системами (сами знаете. какими, могут иметь довольно непривычный (и, я даже сказал бы,
неприличный) вид.
Вспомним, что MS Word в качестве имени файла спокойно берёт первую фразу документа. А если это — вопрос И тогда завершающий имя символ будет в шелле интерпретироваться как шаблона не как элемент имени.
Думаю, ненужно обладать очень развитым воображением, чтобы представить последствия. Что делать в таких ситуациях Для их разрешения резонными людьми придумано было понятие экранирования.
Начнём с первого примера использования экранирования — разрыва длинных строк. Командные директивы, с многочисленными их опциями,
особенно в полной форме, и аргументами могут оказаться весьма длинными,
не укладывающимися в пределы экранной строки. Правда, обычно командная оболочка по умолчанию настраивается с разрешением так называемого word а (то есть переноса слов команды без обрыва строки — последнее,
как мы помним, достигается нажатием клавиши Enter или комбинации и приводит к немедленному исполнению введённой команды. Если ввод ее не окончен — последует сообщение об ошибке. Однако перенос
«слов» при этом происходит, как бог надушу положит. Ив результате командная директива теряет читабельность и становится сложной для понимания.
Тут-то и приходит на помощь понятие экранирования, упомянутое абзацем выше. Знак экранирования — обратный слэш (\), — превращает символ,
имеющий специальное значение, например, упоминавшийся ранее шаблон в именах файлов — *, в самую обычную звездочку. А раз конец строки — тоже символ, хотя и специальный, то ион доступен для экранирования. Так что
если завершить введённый фрагмент команды обратным слэшем (некоторые оболочки требуют предварить его пробелом, и лучше таки делать, хотя вили пробел необязателен, после чего нажать Enter, то вместо попытки исполнения будет образована новая строка. в которой можно продолжать ввод. Вид приглашения к вводу при этом изменится — это будет так называемое вторичное приглашение командной строки, и его представление настраиваемо, также как и вид приглашения первичного.
Возвращаемся к экранированию обратным слэшем. Действие его распространяется только на непосредственно следующий за ним символ. Если символы, могущие быть воспринятые как специальные, идут подряд, каждый из них должен предваряться обратным слэшем.
У обратного слэша есть ещё одна интересная особенность — я назвал бы ее инвертированием специального значения символов. Для примера некая последовательность цифр (например, 033), введенная в командной строке,
будет воспринята как набор обычных символов. Однако она же может выступать как код какого-либо символа (в частности, 033 — код символа в восьмеричной системе счисления. И подчас возникает необходимость ввода таких кодов (тот же код для Escape, скажем,
затруднительно ввести каким-либо иным образом).
И вот тут обратный слэш проявляет свое инвертирующее действие:
последовательность \033 будет восприниматься уже не как набор символов, а как код символа Escape (обратим внимание, что тут достаточно единичного слэша). Непосредственно в командной строке такой способ инвертированного экранирования, по понятным причинам, обычно не используется, но находит широкое применение в сценариях.
О кавычках
Есть и экраны, распространяемые на все, что заключено внутри них. Это кавычки, двойные и одинарные большая часть символов между ними утрачивает свое специальное значение. Ноне все в двойных кавычках сохраняют специальное значение метасимволы $ и \, а также обратные кавычки (`), о назначении которых я скажу чуть позже. То есть в них сохраняется возможность, с одной стороны, получения значений переменных
(как мы помним, с помощью ИМЯ. Ас другой стороны, если нам требуется дать символ бакса в его прямом и привычном значении, у насесть возможность заэкранировать его обратным слэшем. И если потребуется вывести на экран сообщение с вас, уважаемый, пятьсот баксов, то это можно сделать таким образом echo "с вас, уважаемый, \$500" ещё одно широко применяемое использование двойных кавычек экранирование пробелов, предотвращающих разбиение аргументов команды на отдельные слова. Правда, в случае с командой echo это, как правило, не требуется (хотя настоятельно рекомендуется экранировать ее аргумент таким образом. Однако представьте, что в качестве аргумента команды копирования и перемещёния выступает файл, переписанный с Windows- машины. Ведь там пробелы в именах — вещь обычная. Тут-то экранирование двойными кавычками и придется к месту.
Из сказанного понятно, почему двойные кавычки именуются ещё
неполными, или нестрогими они все же допускают внутри себя
использование символов со специальными значениями. В противоположность им, кавычки одинарные носят имя строгих, или полных. Потому что между ними утрачивают специальное значение все метасимволы, кроме их самих — в том числе и символ единичного экранирования. В итоге они используются там,
где гарантированно требуется отсутствие специальных символов. Если вы помните, мы применили строгие кавычки при установке псевдонимов. Они же часто оказываются обязательными при определении переменных.
Завершая тему экранирования, осталось сказать только об обратных кавычках. Их функция очень узка они служат для экранирования команд. То есть, скажем, команда echo date в полном соответствие со своим именем, просто выведет нам собственный аргумент Однако если аргумент команды закрыть обратными кавычками, то date будет воспринято как имя команды, подлежащей исполнению. И результат этого исполнения (то есть текущая дата и время — а именно для их получения и предназначена команда date) будет замещать имя команды в выводе echo:
$ echo `date`
Втр Дек 16 11:45:12 MSK 2003 Если вспомнить, что обратные кавычки сохраняют свое специальное значение внутри кавычек двойных, становится ясной польза от их применения они незаменимы в тех случаях, когда требуется вывод результатов работы одной команды внутри другой. К как в нашем примере с выводом даты, если его (вывод) следует включить в некое выдаваемое командой echo сообщение.
Конечно, в описанном случае добиться той же цели можно было бы гораздо легче — просто командой date. Однако представьте, что у нас возникло желание одновременно и получить сведения о количестве пользователей в системе (для чего предназначена команда who). Тут-то и выясняется. что проще всего это сделать командой типа следующей echo "На момент `date` в системе зарегистрированы `who`" Ответом на что будет сообщение, подобное тому, что часто можно наблюдать на главной странице многих сайтов:
На момент Сб. дек. 20 06:05:56 MSK 2014 в системе зарегистрированы alv tty8 2014-12-15 00:34 (:0) alv pts/1 2014-12-15 00:34 (:0) alv pts/5 2014-12-19 09:37 (:0)
А теперь последнее, чем и закроем тему регулярных выражений вообще. В
этом разделе рассматривалось использование метасимволов в командной оболочке (конкретно, в данном случаев и Zsh). В других оболочках применение метасимволов и условия их экранирования могут несколько отличаться. И к тому же многие запускаемые из строки шелла команды могут иметь свои правила построения регулярных выражений. Так что в итоге их форма определяется сочетанием особенностей конкретной оболочки и команды, из неё запущенной. Все это при необходимости будет оговариваться в дальнейшем.
А пока переходим к рассмотрению командных конструкций — одной из тех особенностей CLI, которая определяет мощь и универсальность этого интерфейса.


Поделитесь с Вашими друзьями:
1   ...   4   5   6   7   8   9   10   11   ...   30


База данных защищена авторским правом ©nethash.ru 2017
обратиться к администрации

войти | регистрация
    Главная страница


загрузить материал