Раздутая команда эха - PullRequest
       65

Раздутая команда эха

9 голосов
/ 20 июля 2010

Посмотрите на следующие реализации команды "echo":

Когда вы пройдете по списку, я уверен, что вы заметите нарастание раздувания в каждой реализации. Какой смысл программы 272 эхо?

Ответы [ 3 ]

14 голосов
/ 20 июля 2010

В своей статье «Дизайн программы в среде 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 должны тщательно проверять свои аргументы перед тем, как что-либо печатать, а для этого требуется больше кода. И разные системы решили, что они хотят по-разному интерпретировать свои аргументы, что приводит к разным объемам кода.

7 голосов
/ 20 июля 2010

Вы заметите, что не так много раздувания.

  1. Большинство строк кода являются комментариями.
  2. Большинство строк кода, которые не являются комментариями,являются документацией по использованию, поэтому, когда кто-то запускает 'echo --help', он что-то делает.
  3. Кажется, что код вне описанного выше в основном обрабатывает аргументы, которые может принимать echo, а также "специальное" расширениетакие символы, как \ n и \ t, должны быть эквивалентными символами, а не отображать их буквально.

Кроме того, большую часть времени вы даже не запускаете команду echo, большую часть времени 'echo 'вызывает встроенную оболочку.По крайней мере, на моем компьютере, вы должны набрать /bin/echo --help, чтобы получить все расширенные функциональные возможности / документацию, потому что echo --help просто echo's --help

Для хорошего примера запустите это в вашей оболочке.

 echo '\e[31mhello\e[0m'

Затем запустите это:

 echo -e '\e[31mhello\e[0m'

И вы заметите совершенно разные результаты.

Первый просто выдаст входные данные как есть, нопоследний напечатает hello красного цвета.

Другой пример с использованием шестнадцатеричного кода:

$echo '\x64\x65\x66'
\x64\x65\x66

$echo -e '\x64\x65\x66'
def

Совершенно другое поведение.Реализация openbsd не может этого =).

1 голос
/ 22 февраля 2011

Я не уверен, что мне нравится первая реализация: у нее слишком много опций!

Если требуется опция -n, то добавление опции -- для остановки обработки опции приведет кбыть полезным.Таким образом, если вы пишете сценарий оболочки, который читает и печатает пользовательский ввод, вы не получите противоречивого поведения, если пользователь введет -n.

...