$ echo \*\*\*
Хотя строка
\*\*\*
не похожа на английское слово, в терминологии языка shell
это слово, ибо им является любая последовательность символов, воспринимаемая интерпретатором как целое, включая даже пробелы, если они взяты в кавычки.Кавычки одного вида могут экранировать кавычки другого вида:
$ echo "Don't do that!"
Don't do that!
$
и могут не заключать в себе весь аргумент:
$ echo x'*'y
x*y
$ echo '*'A'?'
*А?
$
В последнем примере команда
echo
получает один аргумент, не содержащий апострофов, так как, сделав свое дело, апострофы исчезают. Строки в кавычках могут содержать символы строк:$ echo 'hello
> world'
hello
world
$
Символ
>
является вторичным приглашением интерпретатора, которое выдается, если ожидается продолжение ввода для завершения команды. В этом примере апостроф в первой строке должен быть уравновешен другим апострофом. Вторичное приглашение интерпретатора хранится в переменной PS2
; его можно изменить по своему вкусу.Во всех приведенных выше примерах экранирование специальных символов предохраняет их от интерпретации. Команда
$ echo x*y
выдает все имена файлов, начинающиеся с
x
и кончающиеся y
. Как обычно, команда echo
ничего "не знает" ни о файлах, ни о метасимволах; интерпретация *
, если она требуется, осуществляется shell
.Что произойдет, если ни один файл не будет соответствовать шаблону? Интерпретатор просто пропустит строку, как если бы она была взята в кавычки, а не выразит вам свое неудовольствие (как было принято в ранних версиях). Конечно, не следует рассчитывать на это свойство, но его можно использовать, чтобы узнать о существовании файлов, соответствующих шаблону:
$ ls x*y
x*y not found
Сообщение ls: таких файлов нет$ >xyzzy
Создать файл xyzzy$ ls x*y
xyzzy
Файл xyzzy соответствует x*y$ ls 'х*y'
x*y not found
ls не интерпретирует *$
Появление обратной дробной черты в конце строки требует продолжения строки, что является способом задать интерпретатору очень длинную строку:
$ echo abc\
> def\
> ghi
abcdefghi
$
Обратите внимание на то, что символ перевода строки отбрасывается, если перед ним стоит обратная дробная черта, но он остается, если взят в кавычки. Метасимвол
#
в программе на языке shell
практически всюду используется в качестве комментария; если слово начинается с #
, остаток строки игнорируется:$ echo hello#there
hello
$ echo hello # there
hello # there
$
Символ
#
не присутствует в оригинальной седьмой версии, но имеет очень широкое распространение, и в дальнейшем мы будем им пользоваться.Упражнение 3.2Объясните результат выполнения команды
$ ls .
Некоторые дополнительные сведения о команде echo
Команда
echo
выдает заключительный символ перевода строки, даже если на это нет явного запроса. Разумной и, возможно, более корректной была бы такая реализация команды echo
, при которой вывод соответствовал бы только запросу. Добиться этого легко, если потребовать от интерпретатора выдачи приглашения:$ правильное эхо введенная команда:
Введенная команда: $
Нет завершающего перевода строкиОднако при таком решении в самой распространенной ситуации, когда перевод строки нужен, он не подразумевается по умолчанию и требует дополнительного ввода:
$ правильное эхо 'Привет!
>'
Привет!
$
Поскольку команда должна по умолчанию выполнять наиболее часто встречающееся действие, настоящее эхо автоматически добавляет перевод строки.
Но как быть, если это нежелательно? В седьмой версии системы команда
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 согласилась говорить разные "ничего" для нетерпеливого и обидчивого юношей. Она называла "ничего" для обидчивого как '