• Základy programování v shellu. Evoluce linuxových shellů

    Co je to skořápka a proč je potřeba

    Příkazový shell v jakémkoli unixovém systému, který zahrnuje GNU / Linux, je běžný program, který běží jak v textové konzole (která se používá méně často), tak v grafickém prostředí - v okně emulátoru terminálu dostupném na jakémkoli systému Linux .

    Jeho úkol je jednoduchý a zřejmý: přijmout řádek (nebo řádky) vstupu a vytvořit je rozebrat a na základě výsledků této analýzy odpovídajícím způsobem reagovat – provést příkaz, spustit program, zobrazit diagnostickou zprávu atd.

    Téměř ve všech Linuxové distribuce bash shell je přiřazen uživatelům standardně (Bourne Again SHell je další Bourne shell; Steve Bourne je autorem prvního příkazový shell v Unixu - sh). Ve skutečnosti se stal neoficiálním standardem a jeho vylepšením funkčnost pokračuje nepřetržitě. Existují další příkazové shelly - tcsh (verze C-shell), ksh (Korn Shell), zsh atd. - každý má své výhody a nevýhody, stejně jako své vlastní skupiny fanoušků. Nicméně bash je širší veřejnosti známější různé úrovněškolení, proto jsem se pro něj rozhodl. Za zmínku také stojí, že bez ohledu na to, jaké jsou schopnosti různých skořápek, všechny jsou kompatibilní s jejich ideologickým předchůdcem - Bourn Shell (sh). Jinými slovy, skript napsaný pro sh bude správně fungovat v jakémkoli moderním shellu (naopak, obecně řečeno to není pravda).

    Výhody příkazového řádku

    Může vyvstat otázka: proč se obtěžovat s příkazovým řádkem, pokud existují pohodlná a krásná grafická rozhraní? Důvodů je mnoho. Za prvé, ne všechny operace jsou pohodlnější a rychlejší GUI. Za druhé, každý program se řídí základním principem unixových systémů: aby bylo vše jasné určitou práci a udělat to dobře. Jinými slovy, vždy rozumíte tomu, co se stane, když spustíte konkrétní nástroj (pokud něco není zcela jasné, měli byste se podívat do manuálu). Za třetí, zvládnutím příkazů, zkoušením jejich kombinací a kombinací jejich parametrů se uživatel učí systém a získává cenné praktické zkušenosti. Získáte k nim přístup efektivní nástroje, jako pipelines, které umožňují organizovat řetězec příkazů pro zpracování dat, prostředky pro přesměrování vstupu/výstupu a navíc můžete programovat přímo v příkazovém shellu. Možná by stálo za to se u programování zastavit podrobněji, zejména proto, že mnoho systémových skriptů v Linuxu (například skripty pro spouštění systémových služeb) je napsáno pro shell.

    Příkazový shell jako programovací jazyk

    Shell lze tedy považovat za programovací jazyk a jako softwarové prostředí provedení ve stejnou dobu. Tento jazyk se samozřejmě nekompiluje, ale interpretuje. Umožňuje použití proměnných: systémové nebo vlastní. Pořadí provádění příkazů programu se mění pomocí konstrukcí pro kontrolu podmínky a výběr vhodné volby: if-then-else a case. Smyčky While, till a for vám umožňují automatizovat opakované akce. Je možné kombinovat skupiny příkazů do logických bloků. Můžete dokonce psát skutečné funkce s parametry, které jim byly předány. Existují tedy všechny znaky a vlastnosti plnohodnotného programovacího jazyka. Pokusme se z toho získat dvojí užitek – spolu s učením se základům programování automatizujeme naši každodenní práci.

    Ahoj světe! Jednoduchý zálohovací systém

    O potřebě pravidelného Rezervovat kopii Každý zná data, ale uživatelé nikdy nemají dost času na tuto nudnou operaci. Řešení je jednoduché – organizovat automatické vytváření zálohy. Toto bude náš první úkol programování shellu.

    #!/bin/bash # # Zálohovat adresáře a soubory z domovského adresáře # Tento skript shellu lze automaticky spustit pomocí cron # cd $HOME if [ ! -d archivy ] then mkdir archivy fi cur_date=`datum +%Y%m%d%H%M` if [ $# -eq 0 ] ; pak tar czf archive$(cur_date).tar.gz projekty bin else tar czf archive$(cur_date).tar.gz $* fi if [ $? = 0]; then mv archive$(cur_date).tar.gz $HOME/archives echo "$cur_date - Záloha byla úspěšně dokončena." else echo "$cur_date - CHYBA během zálohování." fi

    Jakýkoli příkazový skript (skript - skript, tak se nazývají programy shellu) začíná řetězcem identifikátoru, ve kterém je explicitně uveden interpret příkazů s úplnou cestou k němu. Úplná cesta je sekvenční výpis všech adresářů počínaje kořenem, které musíte zadat, abyste se dostali k cílovému souboru, a samozřejmě název tohoto souboru. Zaznamenání úplné cesty je nesmírně důležité pro jednoznačnou identifikaci každého souboru v hierarchii systému souborů.

    Následují čtyři řádky komentářů. Jakmile shell narazí na znak „#“, považuje všechny následující znaky za komentáře a až do konce je zcela ignoruje. aktuální linka. Komentář tedy nelze spustit od úplného začátku řádku, ale jako doprovod k libovolnému příkazu.

    Za komentáři následuje prázdný řádek. Pro shell to nic neznamená a není provedena žádná akce. Ve skriptech se obvykle vkládají prázdné řádky, aby se kód lépe četl.

    Konečně jsme se dostali k prvnímu „opravdovému“ týmu. Umožňuje změnit adresář (Change Directory), tzn. přesun z aktuálního adresáře do jiného adresáře předaný příkazu jako argument. Ve většině případů je cílový adresář specifikován explicitně, například projekty cd /tmp nebo cd, ale v našem případě se používá předdefinovaná systémová proměnná HOME - obsahuje úplnou cestu k domovskému adresáři aktuálního uživatele, na jehož jménem se provádí příkazový skript. To nám ušetří nutnost provádět změny kódu při každé změně uživatele, protože příkaz vrátí kohokoli do jeho osobního adresáře. Znak dolaru "$" před názvem proměnné znamená, že musíte extrahovat hodnotu obsaženou v této proměnné a nahradit ji na příkazovém řádku místo jejího názvu. Za zmínku stojí zejména to, že v příkazový jazyk důležité jsou skořápky dopisního pouzdra, tzn. HOME, Home a home jsou tři různé proměnné. Podle konvence velká písmena označují názvy systémových proměnných: HOME, PATH, EDITOR a tak dále. Tato konvence nebrání uživatelům ve vytváření vlastních proměnných s názvy z velká písmena, ale proč si komplikovat život porušováním obecně uznávaných norem a pravidel? Rovněž se nedoporučuje měnit hodnoty systémových proměnných, pokud to není nezbytně nutné. Obecně se řídíme jednoduchým pravidlem: systémové proměnné používáme pouze pro čtení, a pokud potřebujeme vlastní, napíšeme její název malými písmeny.

    Náš první příkaz mohl být napsán stručněji:

    cd ~

    Symbol "~" zde také znamená domovský adresář aktuálního uživatele. Veteráni příkazového řádku to vyjádřili ještě stručněji:

    CD

    Jde o to, že když příkazu cd není zadán žádný argument, změní se na domovský adresář.

    Dalším krokem je klasická programová konstrukce kontroly stavu a přijetí příslušného rozhodnutí. Obecné schéma je:

    -li<условие>pak<одна или несколько команд>fi

    Poslední slovo konstrukce (pokud je v obráceném pořadí) funguje jako uzavírací závorka, tzn. hranice seznamu příkazů provedených, když je podmínka pravdivá. Přítomnost fi je povinná, i když je v seznamu pouze jeden příkaz.

    K testování podmínky se zpravidla používá příkaz test nebo jeho alternativní zápis v hranatých závorkách. Jinými slovy, záznamy

    li[! -d archivy] if test! -d archivy

    naprosto rovné. preferuji hranaté závorky, protože jasněji definují hranice kontrolované podmínky. Pravá i levá závorka musí být oddělena od podmínky mezerami.

    Kritéria pro kontrolu podmínky jsou definována různými příznaky. Příkaz test rozpozná jejich velmi velký seznam. V našem příkladu je použit příznak -d, který nám umožňuje zkontrolovat, zda název uvedený za příznakem odpovídá skutečnému adresáři (adresáři). Nejčastěji používané příznaky při práci se soubory jsou:

    F - zda existuje běžný soubor s daným jménem;

    R – zda ​​je pro zadaný soubor nastaveno právo z něj číst;

    W - zda má zadaný soubor právo do něj zapisovat;

    X - zda je pro zadaný soubor nastaveno právo jej spustit;

    S - zda má zadaný soubor nenulovou velikost.

    V našem případě podmínce předchází Vykřičník, označující operaci logické negace, takže význam kontrolované podmínky je zcela opačný. Zkusme si zapsat význam těchto příkazů v běžné ruštině:

    li[! -d archivy ] Pokud adresář archivů (v aktuálním adresáři) neexistuje, začněte spouštět příkazový blok: archivy mkdir vytvoří adresář archivů (v aktuálním adresáři) ukončí příkazový blok.

    Jak vidíte, ukázalo se, že vše není tak složité. Trochu praxe a můžete snadno číst a vytvářet podobné návrhy sami. Příkaz k vytvoření adresáře je tak zřejmý, že není třeba dalšího vysvětlování.

    V dalším řádku vytvoříme vlastní lokální proměnnou cur_date. V naprosté většině případů jsou proměnné vytvořeny pouhým přiřazením konkrétní hodnoty, například:

    ten=10 string="Toto je řádek textu"

    Ale v našem příkladu je použit malý trik. Upozorňujeme, že za rovnítkem - symbolem přiřazení - je příkaz psán v uvozovkách. Tato forma zápisu umožňuje přiřadit proměnné nikoli samotný řetězec, ale výsledek jeho provedení. Zde je výstup příkazu date, který vrací aktuální datum a čas ve formátu určeném seznamem parametrů:

    %Y je aktuální rok v plném tvaru, tzn. čtyři číslice (například 2009);

    %m – číslo aktuální měsíc(například 09 - pro září);

    %d – číslo aktuálního dne;

    %H je aktuální hodina ve 24hodinovém formátu;

    %M je aktuální minuta.

    Pokud tedy spustíte příkaz

    cur_date=`datum +%Y%m%d%H%M`

    10. září 2009 ve 22:45 bude datum_kurzu nastaveno na hodnotu řetězce "200909102245". Účelem tohoto triku je vygenerovat jedinečný, neopakující se název archivního souboru. Pokud máte v úmyslu spustit více instancí programu během jedné minuty, můžete zlepšit jedinečnost názvů přidáním aktuálních sekund. Jak? Podívejte se do manuálu data utility (man date) – není na tom nic složitého.

    Než začneme vytvářet archivní soubor, musíme si určit, které adresáře do něj uložíme. Pro větší flexibilitu můžeme zadat sadu adresářů, které jsou ve výchozím nastavení archivovány, ale poskytnout možnost nahradit tuto sadu seznamem adresářů předávaných jako argument našemu příkazovému skriptu. K tomu se používají speciální proměnné shellu: $# - počet parametrů předávaných skriptu a $* - všechny předané parametry, zapsané ve formátu jednoho řádku.

    if [ $# -eq 0 ] ; pak

    Zkontrolujte podmínku "pokud je počet předávaných parametrů nula" a proveďte následující příkaz. Všimněte si, že klíčové slovo pak lze zapsat do řádku podmínky a oddělit jej od podmíněného výrazu středníkem.

    tar czf archive$(cur_date).tar.gz projekty bin

    Příkaz k vytvoření archivního souboru a komprimaci tohoto souboru. Samotný nástroj tar nekomprimuje, ale pouze shromažďuje všechny dané soubory a adresáře do jednoho souboru tar. K tomu je určen první příznak - c (create - create). Kompresi provádí externí program – zde je to gzip, volaný druhým příznakem – z. Pokud má váš systém více než efektivní program bzip2 kompresi, můžete ji použít změnou příkazu takto:

    tar cjf archive$(cur_date).tar.bz2 projekty bin

    Třetí příznak f říká, že následuje název archivního souboru, takže je vždy poslední v seznamu příznaků. Všimněte si, že při dosazování je název proměnné uzavřen ve složených závorkách. To se provádí za účelem explicitního zvýraznění proměnné v její okolní linii, čímž se eliminuje mnoho potenciálních problémů. Rozšíření archivní soubor nejsou přiřazeny automaticky, vše potřebné si přidáte sami. Jako výchozí archivní adresáře jsem uvedl projekty a bin, ale názvy svých nejcennějších adresářů si můžete zapsat zde.

    Klíčové slovo else otevře alternativní větev provádění. Příkazy tohoto bloku začnou fungovat, pokud kontrola stavu dá výsledek „false“ (v našem příkladu: „počet předávaných parametrů je nenulový“, tj. uživatel zadal názvy adresářů). V tomto případě bude příkaz vypadat takto:

    tar czf archive$(cur_date).tar.gz $*

    Zde byly výchozí adresáře nahrazeny externě akceptovaným řetězcem názvů adresářů. Každou je možné přijmout a zpracovat externí parametr samostatně, ale je pro nás pohodlnější přenést celý řetězec.

    Na konci programu se provede další kontrola. V unixových prostředích všechny příkazy vracejí kód stavu ukončení pro svou práci. Pokud byl příkaz úspěšně dokončen, vrátí kód 0, jinak bude výstupní kód nenulový. Pro kontrolu úspěšnosti předchozího archivačního příkazu používáme další speciální proměnnou $?, která vždy obsahuje hodnotu výstupního kódu nejnovějšího příkazu. Pokud v proměnné $? obsahuje 0, tzn. záložní soubor byl úspěšně vytvořen, poté jej přesuneme do adresáře archivů:

    mv archive$(cur_date).tar.gz $HOME/archives

    a vydejte odpovídající zprávu:

    echo "$cur_date - Zálohování bylo úspěšně dokončeno."

    Pokud kontrola ukázala, že výstupní kód operace archivace není roven nule, zobrazí se chybová zpráva:

    echo "$cur_date - CHYBA během zálohování."

    Tím je práce našeho příkazového skriptu dokončena.

    Abychom mohli otestovat fungování našeho programu, musíme výše popsaný zdrojový kód uložit do souboru, například s názvem bckp, a poté jej pro pohodlí nastavit jako spustitelný:

    chmod 750 bckp

    a spustit:

    ./bckp

    zálohovat výchozí adresáře a

    ./bckp docs programy fungují

    k zálohování uvedených adresářů (uveďte názvy adresářů, které ve vašem systému skutečně existují, jinak se zobrazí chybová zpráva).

    Soubor bckp můžete umístit do jednoho z adresářů zadaných v systémové proměnné PATH. Nejpreferovanější umístění jsou /usr/local/bin nebo $HOME/bin, pokud nějaké máte. Poté můžete spustit bckp jako systémový příkaz.

    Jak automatizovat „plánované“ operace zálohování

    Pár slov o automatizaci zálohování. Za tímto účelem systém plánovač cronu, který čte pracovní pokyny ze speciálního souboru crontab. Chcete-li definovat takové pokyny, musíte vytvořit a upravit soubor crontab pomocí příkazu:

    crontab -e

    Pokyny jsou psány v přesně definovaném formátu (pole jsou oddělena mezerami):

    minuty hodiny den_v_měsíci měsíc den_v_týdnu příkaz

    Jedna možnost pro plánování operací zálohování může vypadat takto:

    30 23 10,20,30 * * /usr/local/bin/bckp

    To znamená, že zálohovací skript (musíte zadat úplnou cestu k tomuto souboru) bude spuštěn ve 23:30 10., 20. a 30. dne každého měsíce, bez ohledu na den v týdnu. (Hvězdičky označují celý rozsah povolených hodnot, v tomto případě: každý měsíc ve 4. poli, kterýkoli den v týdnu v 5. poli)

    Pokud dáváte přednost týdenním souhrnům a váš systém běží 24 hodin denně, 7 dní v týdnu, má smysl naplánovat zálohování mimo špičku:

    0 5 * * 3.5 /usr/local/bin/bckp

    Tady zálohy se vytvoří v 5:00 ve středu a v pátek v každém měsíci (hvězdička ve 4. poli), bez ohledu na počet (hvězdička ve 3. poli).

    O všech složitostech plánování si můžete přečíst v man 5 crontab.

    Výsledky a závěry

    Záložní skript popsaný v tomto článku má skromné ​​funkce. Ale to nebylo jeho hlavním úkolem, ale přimět čtenáře, aby pochopil, co se v něm dá dělat příkazový řádek a nejen zkopírovali a provedli navržené dávkový soubor, ale začal se zajímat o rozšíření svých funkcí, začal studovat obrovské možnosti, které poskytují velitelské shelly. A pokud se někdo po přečtení tohoto článku pokusí vylepšit zde uvedený kód, nebo napíše vlastní verzi nebo implementuje vlastní nezávislý nápad, pak budu mít za to, že hlavního cíle bylo dosaženo.

    Stáhněte si zdroje

    static.content.url=http://www.website/developerworks/js/artrating/

    ID článku=458335

    ArticleTitle=Základy programování shellu

    • tutorial

    Proč a pro koho je článek?

    Zpočátku to byla připomínka pro studenty, kteří začínají pracovat se systémy podobnými unixu. Jinými slovy, článek je určen pro ty, kteří nemají žádné předchozí zkušenosti s unixovým příkazovým řádkem, ale z toho či onoho důvodu se chtějí nebo potřebují naučit, jak s ním efektivně pracovat.

    Převyprávění manů (dokumentace) nebude a článek jejich čtení nijak neruší ani nenahrazuje. Místo toho budu mluvit o hlavních věcech (příkazy, triky a principy), kterým musíte rozumět od samého začátku práce v unixovém shellu, abyste pracovali efektivně a příjemně.

    Článek se zabývá plnohodnotnými unixovými prostředími, s plně funkčním shellem (nejlépe zsh nebo bash) a poměrně širokou sadou standardní programy.

    Co je shell

    Shell (shell, aka „příkazový řádek“, aka CLI, aka „konzola“, aka „terminál“, aka „černé okno s bílými písmeny“) je textové rozhraní pro komunikaci s operačním systémem (dobře, přesně řečeno program, která takové rozhraní poskytuje, ale nyní tento rozdíl není významný).

    Obecně práce přes shell vypadá takto: uživatel (tedy vy) zadá příkaz z klávesnice, stiskne Enter, systém příkaz provede, výsledek provedení zapíše na obrazovku a opět čeká na další příkaz být zadán.

    Typický vzhled skořepiny:

    Shell je hlavní způsob interakce se všemi serverovými systémy typu Unix.

    Kde se nacházejí systémy příkazového řádku?

    Kde na vás může čekat unixový shell, oblíbené možnosti:
    • macOS (bash);
    • vzdálený přístup k serveru pro práci nebo pro osobní webový projekt;
    • domácí souborový server se vzdáleným přístupem;
    • Ubuntu, PC-BSD na notebooku/stolním počítači – systémy podobné Unixu se dnes snadno instalují a používají.

    Jaké úlohy je rozumné řešit pomocí shellu?

    Přirozené úkoly, pro které je skořápka vhodná, užitečná a nepostradatelná:
    • interaktivní práce v terminálu:
      • kompilace, spouštění úloh prostřednictvím make;
      • porovnávání textových souborů;
      • rychlá ad-hoc analýza dat (počet jedinečných IP v logu, rozdělení záznamů po hodinách/minutách atd.);
      • jednorázové hromadné akce (zabít mnoho procesů; pokud pracujete se systémem správy verzí, zvrátit nebo vyřešit spoustu souborů);
      • diagnostika toho, co se děje v systému (semafory, zámky, procesy, deskriptory, místo na disku atd.);
    • skriptování:
      • nastavovací skripty, u kterých se nemůžete spolehnout na spuštění jiných interpretů – ne pro začátečníky;
      • funkce pro přizpůsobení interaktivního shellu (ovlivnění výzvy, změna adresáře, nastavení proměnných prostředí) - také ne úplně pro začátečníky;
      • jednorázové skripty, jako je hromadné překódování souborů;
      • makefiles.

    Absolutně první kroky

    Začínáme: Přihlášení a odhlášení

    Ujistěte se, že přesně víte, jak spustit shell a jak jej opustit.

    Pokud používáte počítač s nainstalovaným Ubuntu, budete muset spustit program Terminál. Na konci práce můžete okno jednoduše zavřít.

    V systému MacOS také spusťte Terminál.

    Pro přístup ke vzdálenému serveru použijte ssh (pokud máte MacOS, Ubuntu nebo jiný unixový systém lokálně) nebo putty (pokud máte Windows).

    kdo jsem, kde jsem?

    Spusťte následující příkazy:
    • hostname - zobrazuje název stroje (serveru), na kterém se právě nacházíte;
    • whoami - zobrazí vaše přihlašovací jméno (vaše jméno v systému);
    • tree -d / |less - pseudografický obraz stromu adresářů na počítači; výstup z rolování - q ;
    • pwd - zobrazí adresář, ve kterém se právě nacházíte; na příkazovém řádku nemůžete být "jen tak", nutně jste v nějakém adresáři (=aktuální adresář, pracovní adresář). Pravděpodobně je aktuální pracovní adresář zobrazen ve vaší výzvě (prompt).
    • ls - seznam souborů v aktuálním adresáři; ls /home - seznam souborů v zadaném adresáři;

    Historie příkazů (historie)

    Důležitou vlastností plnohodnotného příkazového řádku je historie příkazů.

    Spusťte několik příkazů: hostname , ls , pwd , whoami . Nyní stiskněte klávesu nahoru. Předchozí příkaz se objevil ve vstupním řádku. Klávesy nahoru a dolů lze použít k pohybu vpřed a vzad v historii. Když přejdete na název hostitele , stiskněte klávesu Enter - příkaz bude proveden znovu.

    Příkazy z historie lze nejen znovu spouštět, ale i upravovat. Projděte historií k příkazu ls, přidejte k němu klávesu -l (ukázalo se ls -l , před mínusem je mezera, za ním ne). Stiskněte Enter - upravený příkaz bude proveden.

    Listování historií, editace a opětovné spouštění příkazů jsou nejtypičtější akce při práci v příkazovém řádku, zvykněte si.

    kopírovat vložit

    Příkazový řádek je velmi textově orientovaný: příkazy jsou textové, vstupními daty pro většinu standardních programů je text, výsledkem práce je nejčastěji také text.

    Na textu je hezké, že jej lze kopírovat a vkládat, a to platí i pro příkazový řádek.

    Zkuste spustit datum +"%y-%m-%d, %A"
    Zadali jste to úplně ručně nebo jste to zkopírovali z článku? Ujistěte se, že jej můžete zkopírovat, vložit do terminálu a spustit.

    Poté, co se naučíte používat man ", ujistěte se, že můžete zkopírovat a spustit ukázkové příkazy z nápovědy. Chcete-li to zkontrolovat, podívejte se do nápovědy pro datumový program pro sekci PŘÍKLADY, zkopírujte a spusťte první uvedený příklad (stačí v případ: znak dolaru není součástí příkazu , jedná se o podmíněný obrázek vstupní výzvy).

    Jak přesně zkopírovat text z terminálu a vložit jej do terminálu, záleží na vašem systému a jeho nastavení, tak dejte univerzální návod bohužel to nepůjde. Na Ubuntu vyzkoušejte toto: kopírování je pouze výběr myší, vkládání prostředním tlačítkem myši. Pokud to nefunguje, nebo máte jiný systém - podívejte se na internet nebo se zeptejte zkušenějších přátel.

    Klávesy a možnosti

    Při zkoumání historie příkazů jste se již setkali s tím, že příkaz ls má minimálně dvě možnosti. Pokud to nazvete jen tak, vytiskne jednoduchý seznam:

    [e-mail chráněný]: ~/shell-survival-quide> ls Makefile shell-first-steps.md shell-first-steps.pdf shell-survival-quide.md shell-survival-quide.pdf
    Pokud přidáte přepínač -l, zobrazí se podrobné informace pro každý soubor:

    [e-mail chráněný]: ~/shell-survival-quide> ls -l celkem 332 -rw-rw-r-- 1 akira akira 198. února 13 11:48 Makefile -rw-rw-r-- 1 akira akira 15107 14. února 22:26 shell -first-steps.md -rw-rw-r-- 1 akira akira 146226 13. února 11:49 shell-first-steps.pdf -rw-rw-r-- 1 akira akira 16626 13. února 11:45 shell-survival -quide.md -rw-rw-r-- 1 akira akira 146203 13. února 11:35 shell-survival-quide.pdf
    Toto je velmi typická situace: pokud jsou do volání příkazu přidány speciální modifikátory (přepínače, volby, parametry), chování příkazu se změní. Porovnejte: strom / a strom -d / , název hostitele a název hostitele -f .

    Kromě toho mohou příkazy jako parametry používat názvy souborů, adresářů nebo pouze textové řetězce. Snaž se:

    ls -ld /home ls -l /home grep root /etc/passwd

    muž

    man - Nápověda k příkazům a programům dostupným na vašem počítači, stejně jako systémová volání a standardní knihovna C.

    Zkuste: man grep , man atoi , man chdir , man man .

    Posouvání vpřed a vzad se provádí pomocí tlačítek „nahoru“, „dolů“, „PageUp“, „PageDown“, opuštění zobrazení nápovědy se provádí tlačítkem q. Hledání konkrétního textu v článku nápovědy: stiskněte / (lomítko), zadejte hledaný text a stiskněte Enter. Přejít na další výskyty - klávesa n.

    Všechny články nápovědy jsou rozděleny do kategorií. Nejdůležitější:

    Je nutné uvést, z jaké kategorie se má nápověda zobrazovat v případě shody jmen. Například man 3 printf popisuje funkci ze standardní knihovny C a man 1 printf popisuje konzolový program stejného jména.

    Pomocí příkazu man -k můžete zobrazit seznam všech článků nápovědy dostupných na počítači. (tečka je také součástí týmu).

    méně

    Když je potřeba zobrazit velmi dlouhý text (obsah souboru, dlouhý muž atd.) v malém okně terminálu, používají se speciální programy „pager“ (od slova page / page, tedy stránkování). Nejoblíbenější scroller je méně a je to to, co vám poskytuje rolování, když čtete mans.

    Zkuste a porovnejte chování:

    cat /etc/bash.bashrc cat /etc/bash.bashrc |méně

    Soubor můžete okamžitě přenést do scrolleru v parametrech:

    Méně /etc/bash.bashrc

    Listování nahoru a dolů - tlačítka "nahoru", "dolů", "PageUp", "PageDown", exit - tlačítko q. Vyhledání konkrétního textu: stiskněte / (lomítko), zadejte hledaný text a stiskněte Enter. Přejít na další výskyty - klávesa n. (Poznáváte poučení o člověku? Není divu, méně se také používá k zobrazení nápovědy.)

    Práva

    S jakýmkoli souborem nebo adresářem je spojena sada „práv“: právo číst soubor, právo zapisovat do souboru, právo soubor spustit. Všichni uživatelé jsou rozděleni do tří kategorií: vlastník souboru, skupina vlastníků souboru, všichni ostatní uživatelé.

    Oprávnění k souboru můžete zobrazit pomocí ls -l . Například:

    > ls -l Makefile -rw-r--r-- 1 akira studenti 198 13. února 11:48 Makefile
    Tento výstup znamená, že vlastník (akira) může číst a zapisovat soubor, skupina (studenti) může pouze číst a všichni ostatní v uživateli mohou také pouze číst.

    Pokud se vám při práci zobrazí zpráva o odmítnutí oprávnění, znamená to, že nemáte dostatečná oprávnění k objektu, se kterým jste chtěli pracovat.

    Přečtěte si více v man chmod.

    STDIN, STDOUT, potrubí (potrubí)

    Každý vykonávaný program má přiřazeny 3 standardní datové toky: vstupní datový tok STDIN , výstupní datový tok STDOUT , chybový tok STDERR .

    Spusťte program wc, zadejte Good day today , stiskněte Enter, napište good day , stiskněte Enter, stiskněte Ctrl+d. Program wc zobrazí statistiku počtu písmen, slov a řádků ve vašem textu a ukončí se:

    > wc dobrý den dnes dobrý den 2 5 24
    V tomto případě jste dali programu STDIN dvouřádkový text a ve STDOUT jste obdrželi tři čísla.

    Nyní spusťte příkaz head -n3 /etc/passwd , měl by vypadat nějak takto:

    > head -n3 /etc/passwd root:x:0:0:root:/root:/bin/bash démon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x: 2:2:bin:/bin:/usr/sbin/nologin
    V tomto případě program head nečetl nic ze STDIN, ale zapsal tři řádky do STDOUT.

    Představte si to takto: program je potrubí, do kterého proudí STDIN a vytéká STDOUT.

    Nejdůležitější vlastností unixové příkazové řádky je, že „potrubí“ programy mohou být vzájemně propojeny: výstup (STDOUT) jednoho programu může být předán jako vstup (STDIN) jinému programu.

    Taková konstrukce propojených programů se anglicky nazývá pipe (pipe), v ruštině - dopravník nebo potrubí.

    Sloučení programů do potrubí se provádí pomocí symbolu | (svislý pruh)

    Spusťte příkaz head -n3 /etc/passwd |wc , dostanete něco takového:

    > head -n3 /etc/passwd |wc 3 3 117
    Stalo se toto: program head vytiskl tři řádky textu do STDOUT, který se okamžitě dostal do vstupu programu wc, který zase spočítal počet znaků, slov a řádků ve výsledném textu.

    Můžete kombinovat tolik programů, kolik chcete, do potrubí. Můžete například přidat další program wc do předchozího kanálu, který bude počítat, kolik slov a písmen bylo ve výstupu prvního wc:

    > head -n3 /etc/passwd |wc |wc 1 3 24

    Kompilace kanálů (pipes) je velmi běžná věc při práci na příkazovém řádku. Příklad, jak se to dělá v praxi, naleznete v části Sestavení jednolinkového potrubí.

    Přesměrování I/O

    Výstup (STDOUT) programu může být nejen přesměrován do jiného programu, ale jednoduše zapsán do souboru. Toto přesměrování se provádí pomocí > (znaménko větší než):

    Datum > /tmp/today.txt
    V důsledku provedení tohoto příkazu se na disku objeví soubor /tmp/today.txt. Prohlédněte si jeho obsah pomocí cat /tmp/today.txt

    Pokud soubor se stejným názvem již existoval, jeho starý obsah bude zničen. Pokud soubor neexistuje, bude vytvořen. Adresář, ve kterém je soubor vytvořen, musí existovat před provedením příkazu.

    Pokud nechcete soubor přepsat, ale přidat výstup na jeho konec, použijte >> :

    Datum >> /tmp/today.txt
    Zkontrolujte, co je nyní zapsáno v souboru.

    Kromě toho můžete programu předat jakýkoli soubor místo STDIN. Snaž se:

    toaleta

    Co dělat, když něco není jasné

    Pokud narazíte na chování systému, kterému nerozumíte, nebo chcete dosáhnout určitého výsledku, ale nevíte jak, doporučuji vám postupovat v následujícím pořadí (mimochodem, to platí nejen pro shelly):
    • formulujte otázku nebo úkol co nejjasněji - není nic těžšího než vyřešit „nevím co“;
    • nezapomeňte, zda jste se již setkali se stejným nebo podobným problémem - v tomto případě stojí za to vyzkoušet řešení, které fungovalo minule;
    • přečtěte si příslušné man-s (pokud rozumíte, kteří man-s jsou ve vašem případě vhodné) - můžete najít vhodné příklady použití příkazů, potřebné volby nebo odkazy na další příkazy;
    • zamyslete se: je možné úkol trochu změnit? - možná mírnou změnou podmínek získáte problém, který již víte, jak vyřešit;
    • položte svou dobře definovanou otázku ve vyhledávači - možná odpověď najdete na Stack Overflow nebo jiných stránkách;
    Pokud nic z výše uvedeného nepomohlo - vyhledejte radu od učitele, zkušeného kolegy nebo přítele. A nebojte se klást „hloupé“ otázky – není ostuda nevědět, je ostuda se nezeptat.

    Pokud jste vyřešili obtížný problém (sami, pomocí internetu nebo jiných lidí) - zapište si své řešení pro případ, že byste vy nebo vaši spolubojovníci měli znovu stejný problém. Můžete nahrávat do jednoduchého textového souboru, v Evernote, publikovat na sociálních sítích.

    Pracovní metody

    Kopírování a vkládání- z man-s, z článků na StackOverflow atd. Příkazový řádek se skládá z textu, použijte toto: zkopírujte a použijte příklady příkazů, zapište si úspěšné nálezy do paměti, publikujte je na twitteru a blozích.

    Vytáhněte předchozí příkaz z historie, přidejte další příkaz do potrubí, spusťte, opakujte.Cm. Viz také část "Sestavení jednolinkového potrubí".

    Základní příkazy

    • změna adresáře: cd ;
    • prohlížení obsahu souborů: kočka , méně , hlava , ocas ;
    • manipulace se soubory: cp , mv , rm ;
    • výpis adresáře: ls , ls -l , ls -lS ;
    • adresářová struktura: strom , strom -d (můžete předat adresář jako parametr);
    • hledání souboru: najít . -název ... ;

    Analytics

    • wc, wc-l;
    • sort -k - řazení podle zadaného pole;
    • sort -n - číselné řazení;
    • diff - porovnání souborů;
    • grep , grep -v , grep -w , grep "\ " , grep -E - hledání textu;
    • uniq , uniq -c - jedinečné řetězce;
    • awk - ve variantě awk "(tisk $1)" pro ponechání pouze prvního pole každého řádku lze $1 změnit na $2 , $3 atd.;

    Diagnostika systému

    • ps axuww - informace o procesech (spuštěných programech) běžících na stroji;
    • top - interaktivní pohled na procesy nejvíce náročné na zdroje;
    • df - použité a volné místo na disku;
    • du - celková velikost souborů v adresáři (rekurzivně s podadresáři);
    • strace , ktrace - který systém nazývá procesem;
    • lsof - jaké soubory proces používá;
    • netstat -na , netstat -nap - jaké porty a zásuvky jsou v systému otevřené.

    Některé programy možná nemáte, musíte je nainstalovat dodatečně. Některé možnosti těchto programů jsou navíc dostupné pouze privilegovaným uživatelům (root "y").

    Hromadné a poloautomatické provádění

    Nejprve tuto část přeskočte, tyto příkazy a konstrukce budete potřebovat, až se dostanete k jednoduchému skriptování shellu.
    • test - podmínky kontroly;
    • při čtení a procházení řádků STDIN;
    • xargs - náhrada řetězců ze STDIN do parametrů zadaného programu;
    • seq - generování posloupností přirozených čísel;
    • () - kombinovat výstup několika příkazů;
    • ; - dělat jeden po druhém;
    • && - provést, pokud byl první příkaz úspěšně dokončen;
    • || - provést, pokud selže první příkaz;
    • tee - duplicitní výstup programu do STDOUT a do souboru na disku.

    Smíšený

    • datum - aktuální datum;
    • curl - stáhne dokument na zadané adrese URL a zapíše výsledek do STDOUT;
    • dotyk - aktualizovat datum změny souboru;
    • zabít - poslat signál procesu;
    • true - nedělá nic, vrací true, užitečné pro organizování věčných smyček;
    • sudo - spusťte příkaz jako root "a.

    Sestavení jednovrstvého potrubí

    Podívejme se na příklad skutečné úlohy: chceme zabít všechny procesy task-6-server běžící jménem aktuálního uživatele.

    Krok 1.
    Pochopte, který program produkuje přibližně potřebná data, i když ne v jejich čisté podobě. Pro náš úkol se vyplatí získat seznam všech procesů v systému: ps axuww. Běh.

    Krok 2
    Podívejte se na přijatá data očima, vymyslete filtr, který vám některá nepotřebná data vyhodí. Často je to grep nebo grep -v . Pomocí klávesy "Nahoru" vytáhněte předchozí příkaz z historie, přiřaďte mu vymyšlený filtr a spusťte jej.

    Ps axuww |grep `whoami`
    - pouze procesy aktuálního uživatele.

    Krok 3
    Opakujte krok 2, dokud nezískáte čistá data, která chcete.

    "
    - všechny procesy s požadovaným názvem (plus možná nadbytečné jako vim task-6-server.c atd.),

    Ps axuww |grep `whoami` | grep "\ " | grep -v vim ps axuww |grep `whoami` | grep "\ " | grep -v vim | grep -v less
    - pouze procesy s požadovaným názvem

    Ps axuww |grep `whoami` | grep "\ " | grep -v vim |grep -v less |awk "(tisk $2)"

    Pids požadovaných procesů, krok 3 dokončen

    Krok 4
    Použijte vhodný konečný manipulátor. Pomocí klávesy "Nahoru" vytáhneme předchozí příkaz z historie a přidáme zpracování, které dokončí řešení problému:

    • |wc -l pro počítání počtu procesů;
    • >pids pro zápis pids do souboru;
    • |xargs kill -9 procesů ukončení.

    Úkoly na školení

    Chcete si procvičit nové dovednosti? Vyzkoušejte následující úkoly:
    • získat seznam všech souborů a adresářů ve vašem domovském adresáři;
    • získat seznam všech mužských článků z kategorie 2 (systémová volání);
    • spočítejte, kolikrát se slovo grep objeví na manuálové stránce grep;
    • spočítat, kolik procesů aktuálně běží jako root;
    • zjistit, který příkaz se vyskytuje v maximálním počtu kategorií nápovědy (man);
    • spočítejte, kolikrát se slovo var vyskytuje na stránce ya.ru.
    Nápověda: budete potřebovat find , grep -o , awk "(tisk $1)" , regulární výrazy v grep , curl -s .

    Co dál studovat?

    Pokud se vám začne líbit příkazový řádek, nepřestávejte, neustále zlepšujte své dovednosti.

    Zde je několik programů, které se určitě budou hodit, pokud žijete na příkazovém řádku:

    • najít se složitými možnostmi
    • vhodný
    • lokalizovat
    • telnet
    • netcat
    • tcpdump
    • rsync
    • obrazovka
    • zgrep, zless
    • visudo
    • crontab -e
    • poslat mail
    Časem se také vyplatí naučit se skriptovací jazyk, jako je perl nebo python, nebo dokonce oba.

    kdo to potřebuje?

    Vyplatí se dnes učit skriptování příkazového řádku a shellu? Rozhodně to stojí za to. Uvedu jen pár příkladů požadavků Facebooku na kandidáty, kteří chtějí získat práci na FB.

    příkazový interpret

    K poskytování rozhraní příkazového řádku v OS se často používají interpreti příkazů, což mohou být nezávislé programovací jazyky s vlastní syntaxí a charakteristickou funkčností.

    Interpret příkazů command.com je součástí operačních systémů Windows 9x, csh, ksh a další jsou populární unixové shelly ve Windows NT.

    Při nízkoúrovňovém nastavení OS má uživatel zpravidla možnost změnit výchozí interpret příkazů.

    Funkce

    Příkazový interpret provádí příkazy ve svém jazyce zadaném na příkazovém řádku nebo pocházející ze standardního vstupu nebo zadaného .

    Volání systémových nebo aplikačních utilit, stejně jako řídicí struktury, jsou interpretovány jako příkazy. Kromě toho je shell zodpovědný za rozšiřování vzorů názvů souborů a přesměrování a vazby pomocných I/O.

    Spolu se sadou utilit je shell operačním prostředím, plnohodnotným programovacím jazykem a mocným nástrojem pro řešení systémových i některých aplikačních úloh, zejména automatizaci často prováděných sekvencí příkazů.

    Standardní příkazový interpret

    Implementace a dostupnost

    Alternativy

    Spolu se standardními se v otevřených operačních systémech používají i alternativní tcsh shelly, které se liší syntaxí řídicích struktur a chováním proměnných.

    Některé alternativní operační systémy se dodávají s vlastními překladači dávkového jazyka (jako je jazyk dávkových souborů Microsoft Windows NT, jazyk OS/2 atd.)

    Někteří lidé dávají přednost použití nových interpretovaných jazyků, jako je Python, k automatizaci často prováděných sekvencí příkazů.

    Grafický shell

    Grafické shelly pro OC Windows

    Nejnovější verze systému Windows používají jako své prostředí Windows Explorer IDE. Průzkumník Windows je prostředí pro vizuální správu, které zahrnuje pracovní plochu, nabídku Start, hlavní panel a funkce správy souborů. Dřívější verze systému Windows 3.xx zahrnují správce programů jako grafické prostředí.

    Mnoho vývojářů třetích stran nabízí alternativní prostředí, která lze použít místo prostředí Průzkumníka, které je standardně součástí Microsoftu v systému Windows.

    • Aston shell
    • BB4Win
    • Blean
    • Káhira (ve vývoji)
    • Chroma
    • Objevit plochu
    • Geoshell
    • Packard Bell Navigator
    • Programový manažer
    • Zabezpečená plocha
    • SharpE
    • Talisman Desktop
    • vítězný krok
    • Microsoft Bob

    viz také

    Nadace Wikimedia. 2010 .

    Podívejte se, co je "Command Shell" v jiných slovnících:

      - (anglický unixový shell, často jen "shell" nebo "sh") příkazový interpret používaný v operačních systémech rodiny UNIX, ve kterých uživatel ... Wikipedia

      Tento termín má jiné významy, viz Přání. wish (Windowing Shell) je jednoduchý skriptovaný nebo interaktivní příkazový shell UNIX pro X Window System a Mac OS X. Poskytuje uživatelům možnost ovládat komponenty ... ... Wikipedia

      - ... Wikipedie

      Požadavek na interpret příkazového řádku je přesměrován sem. Je potřeba samostatný článek na téma "Interpret příkazového řádku". Vzhled skořápky (eng. Co ... Wikipedia

      Shell operačního systému (z anglického shell shell) je interpret příkazů operačního systému (OS), který poskytuje rozhraní pro interakci uživatele se systémovými funkcemi. Obecně se shelly rozlišují se dvěma typy rozhraní pro ... Wikipedia

      UNIXový shell (anglicky Unix shell, často jen "shell" nebo "sh") je příkazový interpret používaný v operačních systémech rodiny kompatibilních shellů POSIX pocházející z Bourne shellu, který se objevil v Unixu verze 7. Obsah 1 .. ... Wikipedie

      UNIXový shell (anglicky Unix shell, často jen "shell" nebo "sh") je příkazový interpret používaný v operačních systémech rodiny kompatibilních shellů POSIX pocházející z Bourne shellu, který se objevil v Unixu verze 7. Obsah 1 .. ... Wikipedie

      UNIXový shell (anglicky Unix shell, často jen "shell" nebo "sh") je příkazový interpret používaný v operačních systémech rodiny kompatibilních shellů POSIX pocházející z Bourne shellu, který se objevil v Unixu verze 7. Obsah 1 .. ... Wikipedie

    knihy

    • Shell skripty. Linux, OS X a Unix. Průvodce, Taylor Dave. Skripty Shell pomáhají systémovým administrátorům a programátorům automatizovat rutinní úlohy již od prvních počítačů. Od vydání prvního…

    Jak bylo uvedeno výše, pro konstrukci libovolných algoritmů je nutné mít operátory kontroly stavu. skořápka bash podporuje vybrané příkazy -lipakjinak a případ, stejně jako smyčkové operátory pro,zatímco, až do, což z něj dělá výkonný programovací jazyk.

    5.8.1 Provozovatelé -li A test(nebo )

    Konstrukce podmíněného operátoru v mírně zjednodušené podobě vypadá takto:

    if list1 then list2 else list3 fi

    Kde seznam1, seznam2 a seznam3 jsou sekvence příkazů oddělené čárkami a končící středníkem nebo znakem nového řádku. Kromě toho mohou být tyto sekvence uzavřeny do složených závorek: (seznam).

    Operátor -li kontroluje hodnotu vrácenou příkazy z seznam1. Pokud je v tomto seznamu několik příkazů, pak se kontroluje hodnota vrácená posledním příkazem v seznamu. Pokud je tato hodnota 0, pak příkazy from seznam2; pokud je tato hodnota nenulová, příkazy z seznam3. Hodnota vrácená takovým složeným příkazem -li, odpovídá hodnotě vrácené posledním příkazem v právě prováděné sekvenci.

    Úplný formát příkazu -li vypadá jako:

    if list then list [ elif list then seznam ] ... [ else list ] fi

    (hranaté závorky zde znamenají pouze to, že to, co obsahují, je v operátoru nepovinné).

    Jako výraz, který přijde hned poté -li nebo elif, příkaz se často používá test, které lze také označit hranatými závorkami . tým test vyhodnotí nějaký výraz a vrátí 0, pokud je výraz pravdivý, a jinak 1. Výraz je předán programu test jako argument. Místo psaní

    testovací výraz,

    Výraz můžete uzavřít do hranatých závorek:

    [výraz].

    Všimněte si toho test a [ jsou dvě jména stejného programu, ne nějaká magická konverze provedená shellem bash(pouze syntaxe [ vyžaduje uzavírací složenou závorku). Všimněte si také, že místo test ve výstavbě -li lze použít jakýkoli program.

    Na závěr uvádíme příklad použití operátoru -li:

    if [ -e textmode2.htm ] ; pak

    ls textový režim*

    jiný

    pwd

    O operátorovi test(nebo […]) měli bychom mít zvláštní rozhovor.

    5.8.2 Provozovatel test a podmíněné

    Podmíněné výrazy použité v příkazu test, jsou postaveny na základě kontroly atributů souboru, porovnávání řetězců a běžných aritmetických porovnávání. Složité výrazy jsou sestaveny z následujících unárních nebo binárních operací („elementárních stavebních bloků“):

      Soubor

    True, pokud existuje soubor s názvem file.

      B soubor

    Pravda, pokud soubor existuje a jedná se o speciální soubor blokového zařízení.

      C soubor

    Pravda, pokud soubor existuje a jedná se o speciální soubor znakového zařízení.

      D soubor

    Pravda, pokud soubor existuje a je to adresář.

      E soubor

    Pravda, pokud je soubor pojmenovaný soubor existuje.

      F soubor

    Pravda, pokud je soubor pojmenovaný soubor existuje a je to běžný soubor.

      G soubor

    Pravda, pokud je soubor pojmenovaný soubor existuje a je nastaven jeho bit změny skupiny.

      H soubor nebo -L soubor

    Pravda, pokud je soubor pojmenovaný soubor existuje a je symbolickým odkazem.

      K souboru

    Pravda, pokud je soubor pojmenovaný soubor existuje a je nastaven na bit "sticky".

      P soubor

    Pravda, pokud je soubor pojmenovaný soubor existuje a je pojmenované potrubí(FIFO).

      R soubor

    Pravda, pokud je soubor pojmenovaný soubor existuje a je nastaveno ke čtení

      S soubor

    Pravda, pokud je soubor pojmenovaný soubor existuje a jeho velikost je větší než nula.

      Tfd

    True, pokud deskriptor souboru fd je otevřená a ukazuje na terminál.

      u souboru

    Pravda, pokud je soubor pojmenovaný soubor existuje a má nastaven bit uživatele pro změnu.

      w soubor

    Pravda, pokud je soubor pojmenovaný soubor existuje a má oprávnění k zápisu.

      X soubor

    Pravda, pokud je soubor pojmenovaný soubor existuje a je spustitelný.

      O souboru

    Pravda, pokud je soubor pojmenovaný soubor existuje a je vlastněn uživatelem, na kterého ukazuje skutečné ID uživatele.

      G soubor

    Pravda, pokud je soubor pojmenovaný soubor existuje a patří do skupiny identifikované skutečným identifikátorem skupiny.

      S soubor

    Pravda, pokud je soubor pojmenovaný soubor existuje a je zásuvka.

      N soubor

    Pravda, pokud je soubor pojmenovaný soubor existuje a od posledního přečtení se změnil.

      soubor1 -nt soubor2

    Pravda, pokud soubor soubor1 má pozdější čas úpravy než soubor2.

      soubor1 -ot soubor2

    Pravda, pokud soubor soubor1 starší soubor2.

      soubor1 -ef soubor2

    Pravda, pokud soubory soubor1 A soubor2mají stejná čísla zařízení a inodů(inod).

      O optname

    True, pokud je povolena možnost shellu optname. Vysvětlení viz manuálová stránka bash.

      Zstring

    True, pokud je délka řetězce nula.

      N řetězec

    True, pokud je délka řetězce nenulová.

      řetězec1 == řetězec2

    Pravda, pokud se řetězce shodují. Namísto == může být použito = .

      řetězec1 !== řetězec2

    Pravda, pokud se řetězce neshodují.

      řetězec1< string2

    Pravda, pokud řetězec řetězec1 lexikograficky předchází řetězec řetězec2(pro aktuální národní prostředí).

      řetězec1 > řetězec2

    Pravda, pokud řetězec řetězec1 lexikograficky následuje za řetězcem řetězec2(pro aktuální národní prostředí).

      arg1 OP arg2

    Tady OP- uh pak jedna z aritmetických porovnávacích operací: -ekv(rovná se), -ne(není stejné), -lt(méně než), -le(menší nebo stejné), -gt(více), -ge(více nebo stejně). Jako argumenty lze použít kladná nebo záporná celá čísla.

    Z těchto elementárních podmíněných výrazů můžete sestavit libovolně složité výrazy pomocí obvyklých logických operací NEGATIVE, AND a OR:

      !(výraz)

    Booleovský operátor negace.

      výraz1 -a výraz2

    booleovský operátor A(A). True, pokud jsou oba výrazy pravdivé.

      výraz1 -o výraz2

    booleovský operátor NEBO(NEBO). True, pokud je pravdivý jeden z těchto dvou výrazů.

    V příkazech se používají stejné podmíněné výrazy zatímco A až do, na který se podíváme níže.

    5.8.3 Provozovatel pouzdro

    Formát operátora pouzdro je:

    slovo s velkými písmeny v [ [(] vzor [ | vzor ] ...) seznam ;; ] ... esac

    tým pouzdro nejprve vyvolá odhalení slova slovo a pokusí se porovnat výsledek s každým ze vzorků vzor střídavě. Po nalezení první shody se již žádné další kontroly neprovádějí, provede se seznam příkazů za vzorem, se kterým byla nalezena shoda. Hodnota vrácená operátorem je 0, pokud nebyly nalezeny žádné shody se vzorem. Jinak je vrácena hodnota vydaná posledním příkazem v odpovídajícím seznamu.

    Následující příklad příkazu case je převzat ze systémového skriptu /etc/rc.d/rc.sysinit.

    případ "$UTC" v

    ano|pravda)

    CLOCKFLAGS="$CLOCKFLAGS -u";

    CLOCKDEF="$CLOCKDEF (utc)";

    ne|nepravda)

    CLOCKFLAGS="$CLOCKFLAGS --localtime";

    CLOCKDEF="$CLOCKDEF (místní čas)";

    esac

    Pokud je proměnná ano nebo true, pak se provede první pár příkazů, a pokud je jeho hodnota no nebo nepravda, provede se druhý pár.

    5.8.4 Provozovatel vybrat

    Operátor vybrat umožňuje organizovat interaktivní interakci s uživatelem. Má následující formát:

    vybrat jméno [slovo; ]seznam úkolů; Hotovo

    Nejprve ze šablony slovo vygeneruje se seznam slov odpovídajících vzoru. Tato sada slov se vytiskne se standardní chybou, přičemž každé slovo následuje sériové číslo. Pokud šablona slovo vynechán, poziční parametry se vypisují stejným způsobem. Poté se zobrazí standardní výzva PS3 a shell čeká na zadání řetězce na standardním vstupu. Pokud zadaný řetězec obsahuje číslo odpovídající jednomu ze zobrazených slov, pak proměnná název je přiřazena hodnota rovna tomuto slovu. Pokud je zadán prázdný řetězec, čísla a odpovídající slova se znovu zobrazí. Pokud je zadána jakákoli jiná hodnota, proměnná název je přiřazena hodnota null. Řetězec zadaný uživatelem je uložen v proměnné ODPOVĚĎ. Seznam příkazů seznam provedeny s vybranou hodnotou proměnné název.

    Zde je malý skript:

    #!/bin/sh

    echo "Jaký OS preferujete?"

    vyberte var v "Linux" "Gnu Hurd" "Free BSD" "Ostatní"; dělat

    přestávka

    Hotovo

    echo "Vybrali byste $var"

    Jaký OS preferujete?
    1) Linux
    2) GnuHurd
    3) FreeBSD
    4) Jiné
    #?

    Stiskněte libovolné ze 4 navrhovaných čísel (1,2,3,4). Pokud zadáte například 1, zobrazí se následující zpráva:

    „Vybrali byste si Linux“

    5.8.5 Provozovatel pro

    Operátor pro funguje trochu jinak než v běžných programovacích jazycích. Místo organizování hodnoty nějaké proměnné tak, aby se při každém průchodu smyčkou zvýšila nebo snížila o jednu, přiřadí proměnné další hodnotu z daného seznamu slov při každém průchodu smyčkou. Obecně platí, že design vypadá asi takto:

    pro jméno ve slovech do seznamu hotovo.

    Pravidla pro vytváření seznamů příkazů ( seznam) jsou stejné jako v operátoru -li.

    Příklad. Následující skript vytvoří soubory foo_1, foo_2 a foo_3:

    pro a v 1 2 3; dělat

    dotkněte se foo_$a

    Hotovo

    Obecně má příkaz for formát:

    pro jméno [slovem; ]seznam úkolů; Hotovo

    Nejprve je zjeveno slovo slovo podle výše uvedených pravidel expanze výrazu. Pak proměnná název výsledné hodnoty jsou postupně přiřazeny a pokaždé seznam příkazů l ist. Pokud " ve slově“ je vynechán, pak seznam příkazů seznam se provede jednou pro každý zadaný poziční parametr.

    Linux má program seq, který vezme dvě čísla jako argumenty a vrátí posloupnost všech čísel mezi danými. S tímto příkazem můžete vynutit pro PROTI bash pracovat přesně stejným způsobem, jako podobný operátor pracuje v konvenčních programovacích jazycích. K tomu stačí napsat cyklus pro následujícím způsobem:

    pro a v $(seq 1 10) ; dělat

    cat file_$a

    Hotovo

    Tento příkaz zobrazí obsah 10 souborů na obrazovce: " soubor_1", ..., "soubor_10".

    5.8.6 Operátoři zatímco A až do

    Operátor zatímco funguje jako -li, pouze provedení operátorů ze seznamu seznam2 cykluje, dokud je podmínka pravdivá, a přeruší, pokud podmínka neplatí. Struktura vypadá takto:

    zatímco seznam1 provede seznam2.

    while [ -d můjadresář ] ; dělat

    ls -l mydirectory >> logfile

    echo -- SEPARATOR -- >> soubor protokolu

    spát 60

    Hotovo

    Takový program bude protokolovat obsah adresáře "mydirectory" každou minutu tak dlouho, dokud adresář existuje.

    Operátor až do podobný operátorovi zatímco:

    dokud není seznam1 proveden seznam2.

    Rozdíl je v tom, že výsledek se vrátil při provádění seznamu příkazů seznam1, se bere s negací: seznam2 se provede, pokud je poslední příkaz v seznamu seznam1 vrátí nenulový výstupní stav.

    5.8.7 Funkce

    Syntax

    skořápka bash umožňuje uživateli vytvářet vlastní funkce. Funkce se chovají a používají úplně stejně jako běžné příkazy shellu, tedy můžeme sami vytvářet nové příkazy. Funkce jsou konstruovány následovně:

    název funkce () ( seznam )

    A to slovo funkce není nezbytné, název definuje název funkce, pomocí které ji lze volat, a tělo funkce se skládá ze seznamu příkazů seznam mezi a ). Tento seznam příkazů se provede pokaždé, když zadáte jméno název daný jako název příkazu, který se má vyvolat. Všimněte si, že funkce mohou být definovány rekurzivně, takže je povoleno volat funkci, kterou definujeme, uvnitř sebe.

    Funkce se spouštějí v kontextu aktuálního shellu: nespouští se žádný nový proces pro interpretaci funkce (na rozdíl od shellových skriptů).

    Argumenty

    Když je funkce volána k provedení, argumenty funkce se stanou polohové parametry(poziční parametry) během výkonu funkce. Jmenují se jako $ n, Kde n je číslo argumentu, ke kterému chceme získat přístup. Číslování argumentů začíná na 1, takže $1 je první argument. Můžeme také získat všechny argumenty najednou $* a počet použitých argumentů $# . Polohový parametr 0 se nemění.

    Pokud je v těle funkce vestavěný příkaz vrátit se, provádění funkce se přeruší a řízení se po volání funkce přenese na příkaz. Když je funkce dokončena, poziční parametry a speciální parametr # jsou vráceny hodnoty, které měly před spuštěním funkce.

    Místní proměnné (místní)

    Pokud chceme tvořit lokální parametr, můžete použít klíčové slovo místní. Syntaxe pro jeho nastavení je úplně stejná jako u normálních parametrů, pouze definici předchází klíčové slovo local:místní jméno=hodnota.

    Zde je příklad nastavení funkce, která implementuje výše zmíněný příkaz seq:

    seq()

    místní I=$1;

    zatímco [ $2 != $I ]; dělat

    echo -n "$I";

    I=$(($I + 1))

    Hotovo;

    echo $2

    Věnujte pozornost možnosti -n operátor echo, zruší přechod na nový řádek. I když to není nezbytné pro účely, které zde máme na mysli, může být užitečné pro jiné použití funkce.

    Faktorová funkce skutečnost

    Ještě jeden příklad:

    skutečnost()

    if [ $1 = 0]; pak

    echo1;

    jiný

    echo $(($1 * $(skutečnost $(($1 - 1)))))

    Toto je faktoriální funkce, příklad rekurzivní funkce. Věnujte pozornost aritmetickému rozšiřování a substituci příkazů.

    V. Kostromin (kos at rus-linux dot net) - 5.8. Shell jako programovací jazyk

    Hlavním prostředím pro interakci s UNIXem je příkazový řádek. Jeho podstatou je, že každý řádek přenesený uživatelem do systému je příkaz, který musí provést. Dokud nestisknete klávesu Vstupte, řádek lze upravit a poté je odeslán do systému.

    Příkazy jsou interpretovány a prováděny speciálním programem − skořápka(nebo "shell", v angličtině). Prostřednictvím příkazového shellu jsou spravovány uživatelské procesy - k tomu se používají nástroje pro výměnu mezi procesy.

    Příkazový shell je přímo připojen k terminálu, přes který se přenášejí řídicí sekvence a text. Obrázek (3.1) ukazuje obecné schéma interakce uživatele se systémem při použití příkazového řádku.

    Obrázek 3.1. Rozhraní příkazového řádku

    Simultánní přístup do systému

    Každý počítač se systémem UNIX poskytuje možnost přihlášení a přístupu k systému více uživatelům současně. I když mají všichni uživatelé k dispozici pouze jeden monitor a jednu systémovou klávesnici, je tato funkce užitečná: současná registrace více uživatelů v systému vám umožňuje pracovat střídavě, aniž byste museli pokaždé dokončit všechny započaté úkoly a poté v nich pokračovat. Pod stejným přihlašovacím jménem je možné se do systému přihlásit i vícekrát. Můžete tak přistupovat ke stejným zdrojům a organizovat paralelní práci na několika úkolech.

    Typický způsob, jak moderní verze UNIXu organizovat paralelní práci uživatelů, je virtuální konzole. Virtuální konzole je několik programů paralelně spuštěných operačním systémem, které umožňují uživateli přihlásit se do systému v textovém režimu a přistupovat k příkazovému řádku (viz Obrázek 3.2 – „Virtuální a grafické konzole“).

    V operační systém Přepínání Linuxu mezi virtuálními konzolami v textovém režimu se provádí pomocí kombinace kláves alt-F1,alt-F2 a tak dále. V tomto případě je každá virtuální konzole označena speciálním názvem: "tty1", "tty2" atd. Ke každé kombinaci je přiřazena odpovídající očíslovaná virtuální konzole. Každá z těchto konzolí je spojena se svou vlastní terminál, který je charakterizován souborem zařízení s příslušným názvem (například /dev/tty1).

    Moderní verze systému UNIX poskytují uživatelům grafická uživatelská rozhraní, která také poskytují možnosti příkazového řádku. Této schopnosti je dosaženo pomocí grafické terminály- speciální programy, které emulují textový terminál v grafickém okně.

    Je také možné spustit několik grafických subsystémů, pak mezi nimi bude přepínání probíhat podobně jako přepínání mezi virtuálními konzolemi - kombinace kláves ctrl-alt-F1.

    Obrázek 3.2. Virtuální a grafické konzole

    Každé koncové zařízení má své možnosti vstup a výstup informací. Příklady takových schopností jsou: počet barev displeje, schopnost pohybovat kurzorem a měnit velikost obrazovky, sada řídicích znaků atd. Terminály jsou rozděleny podle typy: sada funkcí regulovaných ve speciálním konfiguračním souboru. Příklady typů jsou: tty (dálnopis) nebo xterm (grafický terminál). Typ terminálu je explicitně specifikován v názvu zařízení terminálu (například /dev/tty1). Všechna nastavení typu terminálu jsou umístěna v adresáři /etc/termcap.