В своей статье «Дизайн программы в среде UNIX» Пайк и Керниган обсуждают, как программа cat
присваивает управляющие аргументы. Где-то, хотя и не в этой статье, был комментарий о том, что «cat
вернулся из Беркли, размахивая флагами». Это похоже на проблему с echo
опциями разработки. (Я нашел ссылку на соответствующую статью в справочной странице BSD (Mac OS X) для cat
: Роб Пайк, "Стиль UNIX, или cat -v считается вредным" , Материалы USENIX Summer Conference Proceedings, 1983. См. Также http://quotes.cat -v.org / программирование / )
В своей книге «Среда программирования UNIX» Керниган и Пайк (да, опять же, эти двое) цитируют Дуга Макилроя о том, что «эхо» должно делать без аргументов (около 1984 г.):
Другой вопрос философии заключается в том, что echo
должен делать, если ему не приводятся аргументы - в частности, должен ли он печатать пустую строку или вообще ничего не печатать. Все известные нам echo
реализации печатают пустую строку, но предыдущие версии этого не делали, и по этому вопросу шли большие дебаты. Даг Макилрой передал правильные чувства мистики в своей дискуссии на тему:
UNIX и Эхо
В стране Нью-Джерси обитала UNIX, прекрасная горничная, которой исследователи путешествовали далеко, чтобы восхищаться. Ослепленные ее чистотой, все стремились поддержать ее, одну за ее девственную грацию, другую за ее отполированную вежливость, еще одну за ее ловкость в выполнении трудных задач, редко выполняемых даже в гораздо более богатых странах. Она была такой душевной и любезной по природе, что в UNIX были приняты все, кроме самых невыносимо богатых ее женихов. Вскоре многие потомки росли, процветали и распространялись до самых краев земли.
Природа сама улыбалась и отвечала на UNIX более охотно, чем на других смертных существ. Люди-скромники, которые мало знали о более вежливых манерах, восхищались ее эхом , настолько точными и кристально чистыми, что едва ли верили, что ей могут ответить те же камни и леса, которые так искажали свои крики в пустыне. И совместимая UNIX с полным откликом ответила на все вопросы, которые ей задавали.
Когда один нетерпеливый Суэйн спросил UNIX: «Эхо ничего», UNIX с готовностью открыла рот, ничего не повторила и снова закрыла.
«Что ты имеешь в виду, - потребовал юноша, - открывая тебе рот таким образом? Впредь никогда не открывай рот, когда ты должен ничего не повторять! И UNIX обязан.
«Но я хочу идеального исполнения, даже когда ты ничего не повторяешь, - умолял чувствительный юноша, - и от закрытого рта не может быть идеального отклика». Не желая никого обидеть, UNIX согласился сказать разные вещи для нетерпеливой молодежи и бесчувственной молодежи. Она называла ничего не чувствительного «\n
».
Однако теперь, когда она сказала «\n
», она на самом деле ничего не говорила, поэтому ей пришлось дважды открыть рот, один раз, чтобы сказать «* 1037», и один раз, чтобы ничего не сказать, и поэтому она не угодила чувствительный юноша, который сразу сказал: «1038» звучит для меня как совершенное ничто, но второй разрушает его. Я хочу, чтобы ты забрал один из них. Поэтому UNIX, который не мог терпеть оскорбления, согласился отменить некоторые эхо и назвал это «\c
». Теперь чувствительный юноша мог слышать идеальное эхо ничего, спрашивая «\n
» и «\c
» вместе. Но они говорят, что он умер от избытка нотной записи еще до того, как услышал ее.
Оболочка Korn представила (или, по крайней мере, включила) команду printf
, которая была основана на функции языка C printf()
и которая использует строку формата для контроля того, как должен отображаться материал. Это лучший инструмент для сложного форматирования, чем echo
. Но из-за истории, изложенной в цитате, echo
больше не просто повторяет; оно интерпретирует то, что дано эхо.
И интерпретация аргументов командной строки для echo
, несомненно, требует больше кода, чем их не интерпретирует. Основная команда echo:
#include <stdio.h>
int main(int argc, char **argv)
{
const char *pad = "";
while (*++argv)
{
fputs(pad, stdout);
fputs(*argv, stdout);
pad = " ";
}
fputc('\n', stdout);
return 0;
}
Есть и другие способы достичь этого. Но более сложные версии echo
должны тщательно проверять свои аргументы перед тем, как что-либо печатать, а для этого требуется больше кода. И разные системы решили, что они хотят по-разному интерпретировать свои аргументы, что приводит к разным объемам кода.