Чрезмерно увеличенная в размерах команда эха

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

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

9
задан cnst 1 October 2015 в 10:11
поделиться

2 ответа

Вы заметите, что на самом деле наблюдается не такой большой рост вздутия.

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

Кроме того, большую часть времени вы даже не запускаете команду echo, большую часть времени 'echo' вызывает встроенную оболочку. По крайней мере, на моей машине вам нужно набрать / bin / echo --help , чтобы получить от него все расширенные функции / документацию, потому что echo --help просто echo ] - 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 не может этого сделать =).

7
ответ дан 4 December 2019 в 09:35
поделиться

В своей статье 'Дизайн программ в среде UNIX' Пайк и Керниган обсуждают, как программа cat накапливала управляющие аргументы. Где-то, но не в этой статье, был комментарий о том, что "cat вернулся из Беркли, размахивая флагами". Этот вопрос схож с проблемой, связанной с echo, разрабатывающим опции. (Я нашел ссылку на соответствующую статью в BSD (Mac OS X) man page для cat: Rob Pike, "UNIX Style, or cat -v Considered Harmful", USENIX Summer Conference Proceedings, 1983. См. также http://quotes.cat-v.org/programming/)

В своей книге "Среда программирования UNIX" Керниган и Пайк (да, опять эти двое) цитируют Дуга Макилроя по вопросу о том, что должно делать "echo" без аргументов (примерно 1984 год):

Еще один философский вопрос - что должно делать echo при отсутствии аргументов - в частности, должно ли оно печатать пустую строку или вообще ничего. Все известные нам текущие реализации echo печатают пустую строку, но прошлые версии этого не делали, и по этому поводу были большие дебаты. Даг Макилрой передал правильные чувства мистики в своем рассуждении на эту тему:

UNIX и Echo

В стране Нью-Джерси жила UNIX, прекрасная дева, на которую приезжали любоваться ученые. Ослепленные ее чистотой, все стремились взять ее в жены: одни - за девственную грацию, другие - за отточенную вежливость, третьи - за ловкость в выполнении сложных задач, редко выполняемых даже в гораздо более богатых землях. Она была настолько широка душой и сговорчива, что УНИКС принимала всех, кроме самых невыносимо богатых из своих женихов. Вскоре многочисленное потомство росло и процветало и распространилось до краев земли.

Сама природа улыбалась и отвечала УНИКСу охотнее, чем другим смертным существам. Более скромные люди, не знавшие более учтивых манер, восхищались ее эхом, таким точным и кристально чистым, что они едва верили, что ей могут ответить те же скалы и леса, которые так заглушали их собственные крики в пустыне. И послушная UNIX отвечала совершенным эхом на все, о чем бы ее ни спросили.

Когда один нетерпеливый свин попросил UNIX: "Эхо ничего не повторяет", UNIX услужливо открыла рот, ничего не повторила и снова закрыла его.

"Что значит, - спросил юноша, - так открывать рот? Впредь никогда не открывай рот, когда ты должен повторять эхо! И UNIX подчинился.

"Но я хочу идеального исполнения, даже когда вы ничего не повторяете, - умолял чувствительный юноша, - а идеальное эхо не может исходить из закрытого рта". Не желая обидеть ни того, ни другого, UNIX согласилась говорить разные "ничего" для нетерпеливого и бесчувственного юноши. Чувствительное ничто она назвала "\n\n".

Но теперь, когда она сказала '\n', она на самом деле не говорила ничего, поэтому ей пришлось открыть рот дважды, один раз, чтобы сказать '\n' и один раз, чтобы сказать ничего, и это не понравилось чувствительному юноше, который сразу же сказал: '\n звучит для меня как идеальное ничего, но второе портит его. Я хочу, чтобы ты забрал одну из них". Тогда UNIX, не терпевший обид, согласился убрать несколько отголосков и назвал это '\c'. Теперь чувствительный юноша мог услышать совершенное эхо из ничего, попросив '\n' и '\c' вместе. Но говорят, что он умер от переизбытка нотаций, так и не услышав ни одной.


В оболочке Korn появилась (или, по крайней мере, была включена) команда printf, основанная на функции printf() языка C, которая использует строку формата для управления тем, как должен отображаться материал. Это лучший инструмент для сложного форматирования, чем 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 должны тщательно исследовать свои аргументы, прежде чем что-то напечатать - а это требует больше кода. И разные системы решили, что они хотят делать разное количество интерпретаций своих аргументов, что приводит к разным объемам кода.

14
ответ дан 4 December 2019 в 09:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: