Hlavní navigace

Překlepy - je ten shell opravdu nejlepší?

Tento článek je inspirován několika příběhy, které se odehrály za klávesnicí linuxového (případně i jiného) compu. Některé situace se mohou zdát legrační, jiné zase téměř tragické, ale jedno mají společné: rychlého, zbrklého a nedočkavého programátora :-)

Ten první by mohl mít nadpis: „Kterak si smazat $HOME a nevšimnout si toho“. To byl jeden student, který trávil dlouhé dny i noci v UNIXovém labu. Jednou tak sedím v labu a najednou slyším řev přicházejíci od počítače 195.113.16.93­. Přiběhnu a na terminálu zmíněného kolegy vidím následující řádky:

  [login@comp:~/adresar]$ rm -rf . netscape
  [login@comp:~/adresar]$

Identifikaci uživatele jsem zastřel záměrně, abych se vyhnul případným pokusům o vraždu. Jistě si každý představíte, co by se stalo, kdyby v těch řádcích chybělo `/adresar' :-). I tak, ten kolega nebyl nadšen ztrátou určitých souborů. Resume z toho vyplývající: „Nechápu, koho napadlo začínat názvy konfiguračních/skry­tých souborů tečkou!“ :)

Druhý příběh se malinko liší, i když ve své podstatě jsou všechny stejné – lidská chyba. Jeden člověk rád používal program ‚mc‘ (i takoví jsou bohužel mezi námi :-). Navíc ho velmi rád spouštěl z libovolného adresáře, ale zároveň chtěl, aby výchozí adresáře byly jiné než aktuální (z nějakého podivného důvodu). Tedy chtěl napsat následující příkaz

  $ mc adresar1 adresar2

I stal se překlep a stal se <Enter>, chyba první.

  $ mv adresar1 adresar2

Jelikož se nedělo to, co očekával, nenapadlo ho nic lepšího, než zmáčknout kurzor <Up> a <Enter> – chyba druhá. Resume z toho vyplývající: „Nechápu, jak mohlo někoho napadnout nazvat filemanager ‚mc‘, když klávesa ‚c‘ je tak blízko klávesy ‚v‘!“ :)

Třetí příběh není tolik destruktivní (i když není pravdou, že vůbec), ale spíše konstruktivno-destruktivně-legrační. Co tím myslím, hned vysvětlím. Jistý uživatel U pracoval na jistém projektu P v adresáři A. V tomto adresáři měl soubory S={souborNN.c, souborNN.o, …}. Jeho záměrem bylo slinkovat objektové soubory a následně je vypsat. Tedy zamýšlel následující sekvenci příkazů:

  $ ld -o output *.o
  $ ls -o output *.o

Možná už tušíte, co se stalo, a pravděpodobně tušíte správně. Na obrazovce se objevila malinko jiná sekvence příkazů:

  $ ls -o output *.o
  $ ld -o output *.o

Výsledek byl v podstatě stejný (skoro), takže uživatel U by si toho nevšiml, kdyby tam nebyl uživatel U', který vše pečlivě pozoroval a ihned upozorňoval na vše, co se mu nezdálo. Ponaučení z toho plynoucí: „Nemá cenu zkoušet uživatele U' z shellu, stejně vám na to neskočí!“ :)
POZOR: V tomto příkladu se v podstatě nestane nic špatného, až na to, že uživatel asi neuvidí informace, které chtěl, ale tento (i předchozí) příklad berte jako upozornění na to, že by se mohlo věnovat trochu více pozornosti pojmenovávání programů. Každý linuxák si určitě dokáže představit, jak by to vypadalo, kdyby se stále pokračovalo jako doposud a časem bychom měli mnoho dvoupísmenných příkazů, z nichž některé by dělaly velmi nebezpečné oprace :-)

Čtvrtý příběh je trochu drsnější. Drsnější proto, že uživatelem pracujícím byl root! A povedla se mu celkem hezká věc. Vytvářel startovací skripty pro určitou aplikaci v adresáři /opt/aplikace/etc a chtěl v adresáři /etc/rc.d smazat staré linky a následně tam zkopírovat nové. Napsal tedy následující příkazy:

  $ find /etc/rc.d -name \*$APPLICATION_VAR -exec rm {} \;
  $ cd /etc/rc.d
  $ ln -s /opt/aplikace/etc/*

ALE, jelikož zapomněl definovat proměnnou APPLICATION_VAR, byly zbylé dva příkazy celkem zbytečné. Shell totiž expandoval proměnnou APPLICATION_VAR na "" (nic), * expandoval na znak ‚*‘, parametry tedy byly naprosto v pořádku a program find je přijal bez problémů. Ovšem root nebyl až tak šťastný, že vše zafungovalo a že programy nehlásí žádné chyby. Myslím, že by byl mnohem šťastnější, kdyby se jeho Linux aspoň těch pár minut choval jako Windows (‚Jste si jisti…?‘, ‚Recycle bin‘, ‚Jste si jisti, že .. Recycle bin?‘, …). Ponaučení z toho plynoucí: „Když máte Linux a rádi používáte shell, neříkejte hop, ale koukejte raději na klávesnici, co píšete!“ :)

Na závěr vám prozradím, že až na jednu historku jsou všechny pravdivé a v podstatě přesně tak, jak jsou popsané, se také odehrály. A způsobily jejich autorům nemalé problémy. Také vás všechny prosím, abyste mi nepsali rozhořčené maily o tom, že tomu nerozumím a že to tak přece není (že Recycle bin není problém implementovat pro Linux, že je otřesné nemít alias rm=‚rm -i‘ alespoň pro roota apod.). Některé příběhy jsem zjednodušil záměrně, aby nebyly o technických detailech (to bych musel vypsat .bashrc a .bash_profile uživatelů a ‚set‘ a …), ale o tom, o čem být měly. Tedy prosím vás o jistou úroveň představivosti. Děkuji :)

Našli jste v článku chybu?