- Подписка на печатную версию:
- Подписка на электронную версию:
- Подшивки старых номеров журнала (печатные версии)
LXF133:DrBrown2
Материал из Linuxformat.
Соединим точки
- Когда точка – вовсе не точка? Многие символы живут двойной жизнью, выполняя в разное время разные функции.
В таблице ASCII всего 32 печатных символа, которые не являются ни буквами, ни цифрами. Этого явно мало для такой богатой на синтаксис системы, как Linux, и многие из них работают по совместительству, приобретая значение в зависимости от контекста, в котором они используются. Это и делает работу в командной строке столь забавной.
У точки (назовем ее Точка) особенно разнообразная жизнь, и я решил рискнуть и расспросить ее об этом. Сначала я встретил точку в обычной команде cp:
$ cp /etc/fstab .
«Я: – Привет, Точка. Ты что здесь делаешь?
Точка: – Да вот означаю текущий каталог.
Я: – О, так ты спецсимвол оболочки?
Точка (смутившись): – Вообще-то нет. Я просто точка. Но в каждом каталоге есть ссылка на текущий каталог, под названием ., и . как имя файла означает текущий каталог.»
В следующей команде, которая мне попалась, точек было полно:
$ . ../ .bashrc
Я решил расспросить их по очереди.
«Я: – Привет, первая Точка. Мне тут другая точка все про тебя рассказала. Ты – ссылка на текущий каталог, верно?
Точка: – Не говори глупостей. Я могла бы быть ею, будь я аргументом. А так я команда. Точнее, псевдоним для исходной команды.
Я: – И что ты делаешь?
Точка: – Заставляю оболочку выполнить команды из файла. А сама я – встроенная.»
Две — лучше, чем одна
Подхожу к следующей паре точек – близнецы, что ли?
«Я: – Привет, Точки. Вы часом не особые?
Точки: – Нет, мы означаем “подняться на один уровень вверх в дереве каталогов”.
Я: – А разве это не делает вас особыми?
Точки: – Нет, ссылка .. есть в каждом каталоге, она указывает на родительский каталог.
Я перешел к точке номер 4.
Я: – Привет, Точка 4. Ну ты-то особая?
Точка: – Нет, я часть имени файла. Делаю файл невидимым. (Наклоняется и шепчет мне на ухо.) Но никому не говори. Только ls знает.»
Новую точку я встретил посереди имени файла:
$ gimp sunset.jpg
«Я: – Привет, Точка. Ты особая или нет?
Точка: – Смотря кого спросить. Если файловую систему и ядро, то нет. Но утилиты рабочего стола понимают концепцию расширений файлов, и для них я отделяю имя файла от расширения.»
Итак, является ли точка особым символом или нет, зависит не только от того, где она находится, но и от того, у кого вы спрашиваете. Я начинал путаться. Следующую точку я встретил в самой гуще команды:
grep ‘sshd.*failure’ /var/log/auth.log
«Я: – Привет, Точка. А теперь ты что делаешь?
Точка (гордо): – Я спецсимвол регулярного выражения.
Я: – Это вроде маски файла?
Точка: – Отнюдь. Мы, регулярные выражения, гораздо изящнее, чем эти уродские маски. В маске файла я точка – и все, а в выражении соответствую любому символу. Но все меняет звездочка справа от меня. Вместе мы со звездочкой значим все что угодно – хоть бы и ничего.»
Итак, точки в аргументах grep – это регулярные выражения. Никак я добрался до сути? Встречаю еще одну точку:
grep ‘\.$’ foo
«Я: – Привет, Точка. Прошлая точка мне все объяснила. Ты – спецсимвол регулярного выражения, так?
Точка (сердито глядя влево): – Ну, типа должна была быть, но этот дурацкий обратный слэш меня экранировал. Я стала обычной точкой.
Я: – Я вижу, ты заключена в одиночные кавычки. Зачем они? Это часть регулярного выражения?
Точка: – Нет, оболочка уберет их, прежде чем grep это увидит. Они экранируют обратный слэш.
Я: – Но ты же сказала, что обратный слэш экранирует тебя.
Точка: – Да, но в регулярном выражении, бестолочь. А не для оболочки.
Я: – Давай-ка убедимся, что я все понял правильно. Кавычки нужны, чтобы помешать оболочке отключить специальное значение точки с помощью обратного слэша (хотя для оболочки точка все равно не является специальным символом), так что он выживает и отключает специальное значение точки в регулярном выражении, так?
Точка: – Точно! А все из-за дурацкого обратного слэша…»
Спецсимволы
Спецсимвол (метасимвол) – символ, у которого в определенном контексте появляется особое значение (в отличие от буквального). Их 32: ! “ # $ % & ‘ ( ) * + , - . / : ; < = > ? [ \ ] ^ _ ` { | } ~ и ПРОБЕЛ.
В порядке упражнения: сможете ли вы назвать специальное значение каждого из этих символов для оболочки? Понимает ли оболочка какие-нибудь из этих символов буквально?