Лекции.Орг


Поиск:




Специальные символы и их экранирование

Ряд символов в командах являются специальными символами. Это значит, что они не передаются запускаемой программе или обработчику внутренней команды shell'а, а обрабатываются ДО ТОГО, как команда будет выполнена. То есть специальные символы управляют самим shell'ом. В число таких символов входят:

` ~! @ # $ % ^ & * () _ — [ ] { }:; ' " / \ > <

Если вы хотите, чтобы shell не обрабатывал по-особому специальный символ, а обрабатывал его как обычный символ, то его нужно экранировать. Есть три способа это сделать:

1. Поставить обратный слэш (\) перед специальным символом (по-английски этот метод называется escape). Сам обратный слэш, соответственно, тоже является специальным символом, и его можно так же экранировать (т.е. поставить два слэша: \\). Например:  

grep lucky\*star my\ file #Ищем строку lucky*star в файле my file

Обратный слэш перед обычным, не специальным символом будет просто проигнорирован.

2. Заключить команду или часть команды со специальными символами в двойные кавычки ("). По-английски этот метод называется quote. Двойные кавычки экранируют большинство специальных символов, но не все. Остальные спец. символы внутри двойных кавычек можно экранировать обратным слэшем. Пример:

grep "lucky*star" "my file" #Аналогично предыдущей команде

Обратный слэш внутри двойных кавычек перед обычным символом или символом, который и без него экранируется в двойных кавычках, будет обработан как экранированный слэш. Но его можно и эксплицитно экранировать. Это значит, что команды echo "hello, \slash" и echo "hello, \\slash" выведут на экран одно и то же: hello, \slash.

3. Заключить команду или часть команды в одинарные кавычки (по-английски этот метод тоже называется quote). Они экранируют все специальные символы. Пример:

#Найти строку $1000 в файле my income

grep '$1000' "my income"  

#Символ '$' не экранируется двойными кавычками, а одинарными — экранируется.

Обратный слэш внутри двойных кавычек всегда считается экранированным. Команда echo 'hello, \\slash' выведет на экран hello, \\slash.

Вывод результата работы в файл

Скорее всего, вам когда-нибудь придется записать весь вывод команды в файл. Сделать это просто: команда > имя файла

Например:

#Найти все строки, содержащие подстроку "loruser" в файле /etc/passwd

#и записать их в файл "myfile" в директории "Документы" в домашней директории.

grep loruser /etc/passwd >~/Документы/myfile

При этом учтите, что каждая программа имеет два потока вывода: стандартный поток вывода и поток ошибок. Программа сама определяет, какие сообщения в какой поток выводить. Если вы перенаправите только поток вывода, то ошибки не будут записаны в файл, а будут показаны на экране (и наоборот). Для перенаправления потока ошибок используйте такой синтаксис: команда 2> имя файла

Можно направить в файлы оба потока:

команда > файл_для_вывода 2> файл_для_ошибок

Пример:

grep loruser /etc/passwd >~/Документы/myfile 2>~/Документы/myerrors

При перенаправлении вывода или ошибок в файл файл будет полностью перезаписан (или создан, если его нет). Даже если ничего не будет выведено, файл будет перезаписан и заменен пустым.

Чтобы дописать вывод в конец файла, сохранив предыдущее содержимое, используйте двойной знак "больше" вместо одинарного. То есть:

команда >> файл #Для вывода

команда 2>> файл #Для ошибок

Ввод из файла

Возможно, у вас возникнет и другой вопрос: как заставить программу считать данные из файла, как если бы их вводили с клавиатуры?

Ответ на этот вопрос такой. Практически все популярные программы, для которых это имеет смысл, сами умеют читать данные из файла. Узнайте, как использовать эту функцию в нужной вам программе и пользуйтесь ею.

Но если вы уверены, что такой функции нет, вы все же можете направить данные из файла в поток ввода программы:

команда < файл

Да, можно комбинировать перенаправление ввода и вывода:

команда < файл_для_ввода > файл_для_вывода

Еще раз повторим, что если программа сама умеет читать данные из файла, то лучше пусть читает сама. Это, скорее всего, более надежно и эффективно.

 

Оператор |

Особым вариантом перенаправления вывода является организация программного канала (конвейера). Для этого две или несколько команд, таких, что вывод предыдущей служит вводом для следующей, соединяются (или разделяются, если вам это больше нравится) символом вертикальной черты — "|". При этом стандартный выходной поток команды, расположенной слева от символа |, направляется на стандартный ввод программы, расположенной справа от символа |.

Надо отметить, что оболочка одновременно вызывает на выполнение все команды, включенные в конвейер, запуская для каждой из команд отдельный экземпляр оболочки, так что как только первая программа начинает что-либо выдавать в свой выходной поток, следующая команда начинает его обрабатывать. Точно так же каждая следующая команда выполняет свою операцию, ожидая данных от предыдущей команды и выдавая свои результаты на вход последующей. Если вы хотите, чтобы какая-то команда полностью завершилась до начала выполнения последующей, вы можете использовать в одной строке как символ конвейера |, так и точку с запятой;. Перед каждой точкой с запятой оболочка будет останавливаться и ожидать, пока завершится выполнение всех предыдущих команд, включенных в конвейер.

 

Фильтры

Фильтры — это команды (или программы), которые воспринимают входной поток данных, производят над ним некоторые преобразования и выдают результат на стандартный вывод (откуда его можно перенаправить куда-то еще по желанию пользователя). К числу команд-фильтров относятся команды cat, more, less, wc, cmp, diff, а также следующие команды.

 

 

Таблица 5.1. Команды-фильтры

Команда Краткое описание
grep, fgrep, egrep Ищут во входном файле или данных со стандартного ввода строки, содержащие указанный шаблон, и выдают их на стандартный вывод
tr Заменяет во входном потоке все встречающиеся символы, перечисленные в заданном перечне, на соответствующие символы из второго заданного перечня
comm Сравнивает два файла по строкам и выдает на стандартный вывод 3 колонки: в одной — строки, которые встречаются только в 1 файле, во второй — строки, которые встречаются только во 2-ом файле: и в третьей — строки, имеющиеся в обоих файлах
pr Форматирует для печати текстовый файл или содержимое стандартного ввода
sed Строковый редактор, использующийся для выполнения некоторых преобразований над входным потоком данных (берется из файла или со стандартного ввода)

Особым фильтром является команда tee, которая "раздваивает" входной поток, с одной стороны направляя его на стандартный вывод, а с другой — в файл (имя которого вы должны задать). Легко видеть, что по своему действию команда tee аналогична оператору перенаправления 1>&file.

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

Шаблоны файлов

Метасимвол * осуществляет поиск любой строки символов, включая нулевую (пустую) строку. Вы можете использовать * для обозначения полного или частичного имени файла. Просто символ * ищет все имена файлов и справочников в текущем каталоге, за исключением тех, которые начинаются с точки.

Метасимвол? осуществляет поиск любого одного символа в имени файла за исключением лидирующей точки. Предположим, вы имеете книгу, в которой 12 глав и хотите получить список глав до 9-ой главы. Если ваш каталог содержит следующие файлы: Chapter1, Chapter2, Chapter5, Chapter9, Chapter11, то введите команду ls с метасимволом? для получения всех глав, которые начинаются со строки "Chapter" и заканчиваются одним символом:

$ ls Chapter?

Если вы хотите, чтобы shell нашел любой символ из перечисленных вами символов, то заключите эти символы в квадратные скобки. Предположим, ваш каталог содержит следующие файлы: cat, fat, mat, rat. Если вы воспользуетесь в качестве части имени файла шаблоном [crf], то shell будет искать имена файлов, в которые входят либо буква ``c'', либо буква ``r'', либо буква ``f'' в указанной позиции.

Скобки могут также использоваться для обозначения диапазона символов, цифр или букв. Предположим в вашем каталоге содержатся следующие файлы: chapter1, chapter2, chapter3, chapter4, chapter5, chapter6. Если вы укажете chapter[1-5], то shell найдет файлы с chapter1 по chapter5. Класс символов можно также указать с помощью диапазона букв. Если вы укажете [A-Z], то shell будет искать только большие буквы, если [a-z] - то малые буквы.

 

Запуск команды в фоновом режиме (символ &)

После того, как вы ввели команду в Терминал, вам обычно нужно дождаться завершения ее работы, прежде чем shell вернет вам управление. Это значит, что вы запустили команду в приоритетном режиме. Однако, бывают случаи, когда это нежелательно. Допустим, что вы решили рекурсивно скопировать один большой каталог в другой. Выполнение такой команды может занять несколько минут пока она не выполнится полностью. У вас есть два варианта решения: первый - жестокий, подразумевающий остановку (убивание) команды, а затем повторное ее выполнение, но уже в более подходящее время. Второй - запуск процесса в фоновом режиме. Копирование файлов будет выполняться, но Вы сможете продолжать работу с Терминалом.

Общий формат для запуска команд в фоновом режиме следующий:

command &

 



<== предыдущая лекция | следующая лекция ==>
Текущий каталог и относительные пути | Изменение вида приглашения
Поделиться с друзьями:


Дата добавления: 2018-10-18; Мы поможем в написании ваших работ!; просмотров: 196 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Настоящая ответственность бывает только личной. © Фазиль Искандер
==> читать все изречения...

816 - | 693 -


© 2015-2024 lektsii.org - Контакты - Последнее добавление

Ген: 0.009 с.