В своей статье «Разработка программы в среде UNIX» Пайк и Керниган обсуждают, как программа cat
накапливала управляющие аргументы. Где-то, но не в этой статье, был комментарий о том, что "cat
вернулся из Беркли, размахивая флагами". Это похоже на проблему с echo
вариантами разработки. (Я нашел ссылку на соответствующую статью на справочной странице BSD (Mac OS X) для cat
: Роб Пайк, Стиль UNIX или cat -v, считается вредным, USENIX Summer Conference Proceedings, 1983. См. также http://quotes.cat-v.org/programming/)
В своей книге «Среда программирования UNIX» Керниган и Пайк (да, снова эти двое) цитируют Дуга Макилроя по поводу того, что должно делать «эхо» без аргументов (около 1984 г.):
Другой вопрос философии заключается в том, что должна делать echo
, если не заданы аргументы, в частности, должна ли она печатать пустую строку или вообще ничего. Все известные нам текущие реализации echo
печатают пустую строку, но в прошлых версиях этого не было, и по этому поводу были большие дебаты. Дуг Макилрой придал правильное чувство мистицизма в своем обсуждении этой темы:
UNIX и эхо
Жила-была в земле Нью-Джерси Юникс, прекрасная дева, которой ученые путешествовали далеко, чтобы восхищаться ею. Ослепленные ее чистотой, все стремились жениться на ней, один из-за ее девственной грации, другой из-за ее изысканной вежливости, третий из-за ее ловкости в выполнении сложных задач, редко выполняемых даже в гораздо более богатых странах. Она была так великодушна и уступчива по своей природе, что UNIX принял всех, кроме самых невыносимо богатых из ее женихов. Вскоре многие потомки выросли и процветали и распространились по всему миру.
Сама природа улыбалась и отвечала UNIX более охотно, чем другим смертным существам. Скромные люди, которые мало знали о более придворных манерах, восхищались ее эхом, столь точным и кристально чистым, что они едва верили, что ей могут ответить те же скалы и леса, которые так искажали их собственные крики в пустыне. . И уступчивый UNIX отвечал безупречным эхом того, о чем бы ее ни спрашивали.
Когда один нетерпеливый мальчишка спросил UNIX: «Ничего не повторять», UNIX услужливо открыла рот, ничего не повторила и снова закрыла.
— Что ты имеешь в виду, — спросил юноша, — разинув рот вот так? Впредь никогда не открывай рта, если ты ничего не должен повторять! И UNIX обязан.
«Но я хочу идеального исполнения, даже если вы ничего не повторяете, — умолял чувствительный юноша, — и никакое идеальное эхо не может исходить из закрытого рта». Не желая обидеть ни того, ни другого, UNIX согласились ничего не говорить нетерпеливой молодежи и бесчувственной молодежи. Она назвала чувствительное ничто «\n
».
Но теперь, когда она сказала «\n
», она на самом деле ничего не сказала, поэтому ей пришлось открыть рот дважды, один раз, чтобы сказать «\n
», и один раз, чтобы ничего не сказать, и поэтому она не понравилась чувствительному юноше, который тотчас же сказал: «\n
звучит как идеальное ничто для меня, но второй все портит. Я хочу, чтобы ты забрал одну из них. Таким образом, UNIX, который не мог терпеть оскорбления, согласился отменить некоторые эхо-сигналы и назвал это «\c
». Теперь чувствительный юноша мог услышать идеальное эхо ничего, попросив «\n
» и «\c
» вместе. Но говорят, что он умер от избытка нотной записи, даже не услышав ни одной.
Оболочка Korn представила (или, по крайней мере, включила) команду printf
, которая была основана на функции printf()
языка C и использует строку формата для управления тем, как должен выглядеть материал. Это лучший инструмент для сложного форматирования, чем 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
должны тщательно проверять свои аргументы, прежде чем что-либо напечатать, а это требует больше кода. И разные системы решили, что они хотят по-разному интерпретировать свои аргументы, что приводит к разному количеству кода.
person
Jonathan Leffler
schedule
20.07.2010