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