Но как быть, если это нежелательно? В седьмой версии системы команда echo
имеет единственный флаг -n
, который подавляет последний символ перевода строки:
$ echo -n Enter a command:
Enter a command: $
Приглашение на той же строке
$ echo -
-
Только - является специальным случаем
$
Существует одна маленькая хитрость в случае получения эха от -n
, за которым должен следовать символ перевода строки:
$ echo -n '-n
>'
-n
$
Такое решение некрасиво, но эффективно, к тому же это довольно редкий случай.
Другой подход принят в System V, где команда echo
интерпретирует последовательность символов с обратной дробной чертой аналогично тому, как это делается в языке Си, а именно: \b
обозначает "шаг назад", \c
подавляет перевод строки (правда, здесь не очень точно воспроизведена конструкция Си):
$ echo 'Введенная команда: \с'
Версия System V
Введенная команда: $
Хотя при подобном решении не возникает коллизий при получении эха от знака "-"
, у него есть свои недостатки. Команда echo
часто используется в качестве диагностического средства, а символ обратной дробной черты интерпретируется таким множеством программ, что участие в этом команды echo
только вносит дополнительную путаницу.
Итак, обе реализации команды echo
имеют и положительные, и отрицательные стороны. Мы будем использовать вариант седьмой версии ( -n
), поэтому, если ваша команда echo
выполняется по-другому, несколько приводимых ниже примеров потребуют незначительных изменений.
Возникает еще один, философский, вопрос: что должна делать команда, если ей не передали аргументов, в частности, следует ли ей выдавать пустую строку или вообще ничего не предпринимать? Как вы уже знаете, все настоящие реализации команды выдают пустую строку, но в ранних версиях все было иначе. По этому поводу велись большие дебаты, а Д. МакИлрой привнес в них даже элемент мистицизма.
UNIX и Эхо
Жила-была в стране Нью-Джерси UNIX, прекрасная девушка, к которой приезжали издалека, чтобы полюбоваться ею. Ослепленные чистотой UNIX, все искали ее руки и сердца: одни — за изящество, другие — за изысканную вежливость, третьи — за проворность при выполнении самых изнурительных заданий. Была она от рождения столь великодушна и услужлива, что все женихи остались довольны ею, а ее многочисленное потомство распространилось во все концы земли.
Сама природа покровительствовала UNIX и вторила ей более охотно, чем кому-либо из смертных. Простые люди поражались ее эхом, таким оно было точным и кристально чистым. Они не могли поверить, что ей отвечают те же леса и скалы, которые так искажают их собственные голоса. Когда один нетерпеливый пастушок попросил UNIX: "Пусть эхо ответит ничего", и она послушно открыла рот, эхо промолчало. "Зачем ты открываешь рот?" — спросил пастушок. — "Отныне никогда не открывай его, если эхо должно ответить ничего!" — и UNIX подчинилась.
"Но я хочу совершенного исполнения, даже если эхо отвечает ничего," — потребовал другой, обидчивый, юноша, — "а никакого совершенного эха не получится при закрытом рте". Не желая обидеть никого из них, UNIX согласилась говорить разные "ничего" для нетерпеливого и обидчивого юношей. Она называла "ничего" для обидчивого как ' \n'
. Однако теперь, когда она говорила ' \n'
, на самом деле она не произносила ничего, поэтому ей приходилось открывать рот дважды: один раз, чтобы сказать '\n'
, и второй раз, чтобы не сказать ничего. Это не понравилось обидчивому юноше, который тотчас сказал: "Для меня '\n'
звучит, как настоящее "ничего", но когда ты открываешь рот второй раз, то все портишь. Возьми второе "ничего" назад". Услужливая UNIX согласилась отказаться от некоторых эхо и обозначила это как '\c'
. С тех пор обидчивый юноша мог услышать совершенное эхо "ничего", если он задавал '\n'
и '\c'
вместе, но говорят, что он так и не услышал его, поскольку умер от излишеств в обозначениях.
Упражнение 3.3
Предскажите, что сделает команда grep
в каждом случае, а затем проверьте себя;
grep \$ grep \\
grep \\$ grep \\\\
grep \\\\$ grep "\$"
grep '\$' grep '"$'
grep '\'$ grep "$"
Файл, состоящий из таких команд, послужит хорошим материалом для теста, если вы хотите поэкспериментировать.
Упражнение 3.4
Как указать grep
, что нужно найти шаблон, начинающийся с '-'
? Почему взятие аргумента в кавычки не помогает? Подсказка: исследуйте флаг -е
.
Читать дальше
Конец ознакомительного отрывка
Купить книгу