Nafouklý echo příkaz

hlasů
8

Podívejte se na následující implementací „echo“ command:

Jak jste jít dolů v seznamu, jsem si jistý, že si všimnete, rostoucí udit v každé implementaci. Jaký má smysl z 272 řádek echo programu?

Položena 20/07/2010 v 14:57
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
13

Ve svém článku ‚Program designu v UNIX prostředí‘, Pike & Kernighan diskutovat o tom, jak catprogram, accreted kontrolní argumenty. Někde, i když ne tohoto článku, tam byla zmínka o ‚ catvrátil z Berkeley mávali vlajkami‘. Jedná se o podobný problém na problém s echorozvíjením možností. (Našel jsem odkaz na příslušný článek v BSD (Mac OS X) man stránka pro cat: Rob Pike, "UNIX Style, nebo kočka -v považováno za nebezpečné" , USENIX Summer Conference Proceedings, 1983. Také zde http: // citáty CAT-v.org / programování / )

Ve své knize ‚The UNIX programovacího prostředí‘, Kernighan & Pike (ano, ti dva zase) citát Doug McIlroy na téma, co echo 'dělat bez argumentů (kolem roku 1984):

Další otázkou filozofie je to, co echoby měl dělat, když vzhledem k tomu, žádné argumenty - konkrétně by měla vytisknout prázdný řádek nebo vůbec nic. Všechny stávající echoimplementace víme tisk prázdný řádek, ale minulé verze ne, a tam byly velké debaty na toto téma. Doug McIlroy předával správné pocity mysticismu v jeho diskuzi na téma:

UNIX a Echo

Tam bydlil v zemi New Jersey Unix, spravedlivý služebnou kterého savants cestoval daleko obdivovat. Oslněn její čistotou, všichni se snažili ji obhajovat, jeden pro její panenské milost, druhý pro její leštěného zdvořilosti ještě další pro svou hbitost při plnění náročných úkolů zřídkakdy kultivované iv mnohem bohatších zemích. Tak velké srdce a vstřícný přírody byla ona, že UNIX přijala všechny, ale nejvíce nesnesitelně bohaté z jejích nápadníků. Brzy, mnoho potomků rostl a prosperoval a rozšířil do všech končin země.

Příroda sama se usmál a odpověděl na UNIX horlivěji než jiné smrtelné bytosti. Pokornější folk, kteří věděli trochu více dvorské mravy, radost v ní ozvěny , takže přesné a křišťálově jasné, že málo věřil, že ona by mohla být zodpovězena stejnými skal a lesů, které tak zkomolený své vlastní výkřiky do divočiny. A vyhovující UNIX povinen s perfektními ozvěnou všeho, co byla požádána.

Když se člověk netrpělivý Swain požádal UNIX, ‚Echo nic‘, UNIX ochotně otevřela ústa, zopakoval nic a zase je zavřel.

‚Bez ohledu na to myslíš,‘ zeptal se mladík, ‚otevřel ústa takhle? Od nynějška nikdy otevřít ústa, když jste měl echo nic!‘ A UNIX povinnost.

‚Ale já chci perfektní výkon, i když jste echo nic,‘ prosil citlivé mládí, ‚a žádné dokonalé ozvěny mohou pocházet z zavřená ústa.‘ Kteří si nepřejí urazit buď jeden, UNIX souhlasil říkat různé nesouvislá pro netrpělivé mládeže a necitlivé mládeže. Zavolala citlivé nic ‚ \n‘.

Ale teď, když řekla: ‚ \n‘, nebyla ve skutečnosti nic neříká, takže musela dvakrát otevřela ústa, když se řekne ‚ \n‘ a jednou říkat nic, a tak se nepotěšila citlivého mladíka, který řekl neprodleně, ‚Nahrávka \nzní to jako perfektní nic pro mě, ale druhý ničí ji. Chci tě vzít zpět jednu z nich.‘ Takže UNIX, kteří nemohli snést trestných činů, souhlasil vrátit nějaké ozvěny, a volal, že ‚ \c‘. Nyní je citlivý mladík slyšel dokonalou ozvěnu nic tím, že žádá o ‚ \n‘ a ‚ \c‘ dohromady. Ale říkají, že zemřel přemírou zápisu, než se vůbec neslyšel.


Korn shell zavedena (nebo alespoň v ceně) je printfpříkaz, který byl založen na jazykovém C printf()funkce, a že používá formát řetězce určit, jakým způsobem by se měl objevit materiál. Je to lepší nástroj pro komplikované formátování než echo. Ale vzhledem k historii naznačené v citátu, echonení jen echo nic víc; interpretuje to, co je kladen na echo.

A interpretace argumenty příkazového řádku echonepochybně vyžaduje více kódu než ne jejich výklad. Základní Příkaz echo je:

#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;
}

Existují i jiné způsoby, jak toho dosáhnout. Ale složitější verze echomají kontrolovat své argumenty před tiskem cokoli - a že vyžaduje více kódu. A různé systémy se rozhodli, že chtějí dělat různá množství výkladu svých argumentů, což vede k různým množstvím kódu.

Odpovězeno 20/07/2010 v 16:28
zdroj uživatelem

hlasů
6

Můžete si všimnout, že není ve skutečnosti, že hodně růst udit.

  1. Většina řádků kódu jsou komentáře.
  2. Většina řádků kódu, které nejsou připomínky, dokumentaci používání, takže když někdo jede ‚echo --help‘ to bude něco dělat.
  3. Kód mimo výše uvedeného se zdá z velké části, které mají být manipulace argumenty echo může mít, stejně jako „zvláštní“ expanze pro symboly, jako je \ n a \ t, že jejich ekvivalentní znaky namísto jejich ozvěna doslova.

Také většinu času, nejste ani spuštění příkazu echo, po většinu času ‚echo‘ vyvolá shell vestavěný-in. Alespoň na mém stroji, budete muset zadat /bin/echo --help, aby byly všechny pokročilé funkce / dokumentace z ní, protože echo --helppouze ECHO--help

Za dobrý příklad spustit tento ve své ulity.

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

Poté spusťte toto:

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

A budete na vědomí, výrazně odlišné výsledky.

První z nich bude jen vydávat vstup tak, jak je, ale ten bude tisknout helločervenou barvou.

Další příklad použití ‚hex‘ kód:

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

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

Diametrálně odlišné chování. Realizace openbsd nemůže to =).

Odpovězeno 20/07/2010 v 15:01
zdroj uživatelem

hlasů
0

Nejsem si jistý, jestli se mi líbí první implementaci: má jednu možnost příliš mnoho!

V případě, že -nbyla požadována volba, pak také přidáním --možnost zastavit zpracování voleb by mohla být užitečná. Tak pokud jste psaní shell skript, který čte a vytiskne vstup uživatele, nemusíte dostat nekonzistentní chování v případě, že uživatel zadá -n.

Odpovězeno 22/02/2011 v 11:11
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more