Главная » Программирование для UNIX » Метасимволы UNIX

0

Оболочка распознает и ряд  других символов как специальные; чаще  всего встречается звездочка *, сообщающая оболочке, что следует просмотреть каталог в поиске файлов с именами, в которых на месте * стоит любая символьная строка. Например,

$ echo *

это  жалкое подобие  ls. В главе 1  не  упоминалось, что  при  проверке имен файлов на совпадение не рассматриваются имена, начинающиеся с точки, чтобы избежать проблем с именами «.» и «..», которые есть в каждом каталоге. Правило выглядит следующим образом: при поиске имен файлов, соответствующих шаблону, имена, начинающиеся с точки, считаются подходящими, только если  в шаблоне точка присутствует явным образом. Как  обычно, прояснить ситуацию поможет «здравомыслящая» команда echo или даже несколько таких команд:

$ ls

.profile  junk

temp

$ echo *

junk  temp

$ echo .*

. .. .profile

$

Такие символы, как *, имеющие специальные  свойства, называются метасимволами. Их очень много. Полный список метасимволов представлен в табл. 3.1  (но о некоторых из них будет  рассказано только в главе 5).

Теперь, когда известно о существовании значительного количества метасимволов, надо  найти какой-то способ  сказать оболочке:  «Оставь этот символ в покое». Самый простой и хороший способ защитить специальные символы от интерпретации оболочкой состоит  в том,  чтобы  заключить их в одинарные кавычки:

$ echo ‘***’

***

$

Можно использовать и двойные кавычки "…", но оболочка обычно  заглядывает внутрь таких кавычек в поиске символов $, `…` и \, так что избегайте их,  если обработка строки внутри кавычек нежелательна.

Третий способ состоит  в том,  чтобы  ввести обратную косую  черту  \ перед каждым символом, который требуется защитить от обработки оболочкой, например

$ echo \*\*\*

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

Кавычки одного типа  защищают кавычки другого типа:

$ echo "Don’t  do that!"

Don’t  do that!

$

и не обязательно заключать в кавычки весь аргумент:

$ echo x’*’y

x*y

$ echo ‘*’A’?’

*A?

$

Таблица 3.1. Метасимволы оболочки

Метасимвол  Пояснение

>                       prog>file направляет стандартный вывод  в файл

>>                     prog>>file добавляет стандартный вывод  в конец файла

<                       prog<file берет стандартный ввод из файла

|          p1|p2 направляет стандартный вывод p1  на стандартный ввод p2

<<str                 встроенный  документ  (here  document) –  стандартный  поток ввода начинается в строке непосредственно после символа, при знак окончания – str

*                        соответствует любой  строке из  нуля и  более  символов, входящей в имя файла

?                        соответствует любому отдельному символу в имени файла

[ccc]              соответствует любому  отдельному символу из ccc в имени фай ла, разрешено использование диапазонов, например 0–9 или  a–z

;              указатель конца команды, p1;p2  выполняет p1, затем p2

&                                       аналогично ;, но без ожидания завершения p1

`…`         выполняет команду (команды) в …;  вывод  которых заменяет

`…`


Метасимвол

Пояснение

(…)

{…}

$1, $2 и т. д.

$var

${var}

\ ‘…’

"…"

#

var=value p1   &&   p2

p1   || p2

выполняет команду (команды) в … в дочерней оболочке

выполняет команду (команды) в … в текущей оболочке (редко используется)

$0…$9 заменяются аргументами, переданными командному файлу значение переменной оболочки var

значение var, предотвращает перемешивание при объединении с текстом (см. также табл. 5.3)

\c воспринимает  буквально символ c,  \разделитель5строк игнорируется

воспринимает … буквально

воспринимает … буквально, после  того как интерпретированы

$, `…` и \

если  слово  начинается  с  #,  то  оставшаяся  часть  строки –  это комментарий (нет в седьмой версии)

присваивает значение переменной var запускает p1; в случае успеха запускает p2 запускает p1; в случае неудачи запускает p2

В последнем примере echo видит единый  аргумент без  кавычек, поскольку после того, как они сделали свою работу, кавычки отбрасываются.

Строки, заключенные в кавычки, могут содержать разделители строк:

$ echo ‘hello

> world’ hello world

$

Строка «> »– это второе приглашение на ввод, которое оболочка выво дит в тех случаях, когда она ожидает продолжения ввода для завершения команды. В примере, приведенном выше,  кавычка, открытая в первой строке, должна быть закрыта. Второе приглашение хранится в переменной оболочки PS2 и может быть изменено по желанию пользователя.

Во всех этих  примерах заключение метасимвола в кавычки предотвращает  его интерпретирование оболочкой. Команда

$ echo x*y

выводит все  имена, начинающиеся с  x и  заканчивающиеся y.  Как обычно, echo  ничего не знает о файлах и метасимволах; интерпретацией  символа * (если он есть), занимается оболочка.

Что произойдет, если не будут найдены файлы, соответствующие шаблону? Оболочка вместо того,  чтобы  жаловаться (так  было  в более ранних версиях), передает строку так, как будто она была  заключена в ка вычки. Вообще-то неразумно зависеть от такой линии поведения, хотя с помощью этого эффекта можно попробовать узнать о наличии файла, соответствующего шаблону.

$ ls  x*y

x*y not  found             Сообщение от ls:  таких файлов нет

$ >xyzzy                      Создать xyzzy

$ ls  x*y

xyzzy                            Файл xyzzy соответствует  x*y

$ ls ‘x*y’

x*y not  found             ls не интерпретирует *

$

Обратная косая черта в конце строки означает, что строка будет продолжена; таким образом можно передать оболочке очень длинную строку.

$ echo abc\

> def\

> ghi

abcdefghi

$

Обратите внимание на  то, что  если  разделителю  строк предшествует обратная косая черта, то он отбрасывается, а если же он заключен в ка вычки, то сохраняется.

Метасимвол # практически повсеместно  используется для комментариев  оболочки;  если  слово  оболочки начинается  с #,  то  оставшаяся часть  строки игнорируется.

$ echo hello  # there

hello

$ echo hello#there

hello#there

$

Символ # не входил в оригинальную седьмую версию, но он получил очень  широкое распространение, и поэтому будет использоваться и в этой книге.

Упражнение 3.2. Объясните, каким будет вывод

$ ls .*

~

Источник: Керниган Б., Пайк Р., UNIX. Программное окружение. – Пер. с англ. – СПб: Символ-Плюс, 2003. – 416 с., ил.

По теме:

  • Комментарии