Главная » Программирование для UNIX » Экскурс в команду echo

0

Команда echo выводит заключительный символ разделителя строк, хотя в явном виде  такое требование не существует. Конструкция коман-

ды была  бы более разумной и «чистой», если  бы echo выводила только то, что требуется. Тогда было бы проще выдавать приглашения на ввод:

$ pure-echo  Enter  a command:

Enter  a command:$                Нет замыкающего разделителя строк

Но в таком варианте есть и недостаток – очень часто  оказывается, что переход на новую  строку после  завершения команды желателен, а его отсутствие вызывает необходимость дополнительного ввода:

$ pure-echo  ‘Hello!

>

Hello!

$

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

Но что делать пользователю, которому не нужен этот  разделитель? В седьмой версии есть  специальный параметр –n,  который убирает  последний разделитель строк:

$ echo -n  Enter  a command:

Enter  a command:$                Приглашение на ввод на той же строке

$ echo -

–                                             Только –n имеет специальное значение

$

Существует и трюк, позволяющий вывести –n, а следом  – разделитель строк:

$ echo -n  ‘-n

>

–n

$

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

System V предлагает команде echo другой подход для уничтожения замыкающего разделителя строк – интерпретировать Си-подобные escape-последовательности, такие как \b для символа возврата на одну позицию (backspace) и \c (отсутствует в Си) для  уничтожения последнего разделителя строк:

$ echo ‘Enter a command:\c’                 Версия System V

Enter  a command:$

Хотя  применение этого механизма не порождает путаницы с выводом на терминал знака минус, зато  есть другие проблемы. Дело  в том,  что команда echo часто  применяется для  диагностики, а обратная косая

черта интерпретируется таким большим количеством команд, что если этим займется и echo, все только еще больше запутается.

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

Есть и еще один философский вопрос: что команда echo должна делать, если у нее нет аргументов, точнее, должна ли она печатать пробел  или  не  должна вообще  ничего делать?  Все  современные реализации echo (известные авторам) печатают пробел, а вот более ранние версии не делали этого, когда-то по этому поводу  даже велись жаркие споры. Даг Мак-Илрой (Doug  McIlroy) привнес в обсуждение этой  темы  немного мистицизма.

UNIX и Эхо

Жила-была в королевстве Нью-Джерси девушка UNIX. Издалека  съезжались  ученые, чтобы  посмотреть на  нее,  так  она  была  восхитительна.  Ослепленные ее  чистотой, все  пытались завое вать ее сердце; одних привлекали ее грация и непорочность, других  –  изысканные  манеры, третьих –  ловкость в  выполнении трудных,  обременительных  заданий,  которые редко выполнялись  и в более благоприятных условиях. У девушки было  такое доброе сердце и сговорчивый нрав, что UNIX  приняла всех своих  поклонников, кроме самых богатых. Вскоре появилось множество их потомков, они жили и процветали во всех уголках земли.

Сама  природа улыбалась UNIX  и отвечала ей охотнее, чем  другим смертным. Простой народ, который мало что понимал в высших материях, наслаждался ее эхо  (echo),  оно было таким точным  и кристально чистым, что люди  с трудом верили в то,  что девушке отвечают те же самые леса и горы, которые так искажают их  собственные крики.  А уступчивая 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 осуществляла поиск  по шаблону, начинающемуся с «–»? Почему не помогает заключение аргумента в кавычки? Подсказка: исследуйте параметр –e. ~

Упражнение 3.5. Рассмотрим

$ echo */*

Выводит ли  такая команда все имена из всех каталогов? В каком порядке выводятся имена? ~

Упражнение 3.6 (сложный вопрос). Каким образом ввести / в имя  фай ла (так, чтобы  этот символ не воспринимался как разделяющий ком поненты имени)? ~

Упражнение 3.7. Что произойдет в результате

$ cat  x y >y

и

$ cat  x >>x

Подумайте, прежде чем бросаться к компьютеру. ~

Упражнение 3.8. Почему, если пользователь вводит

$ rm *

команда rm не может предупредить его о том, что он пытается удалить все свои файлы? ~

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

По теме:

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