C2110 Operační systém UNIX a základy programování -1- C2110 Operační systém UNIX a základy programování 6. lekce Petr Kulhánek kulhanek@chemi.muni.cz Národní centrum pro výzkum biomolekul, Přírodovědecká fakulta Masarykova univerzita, Kotlářská 2, CZ-61137 Brno C2110 Operační systém UNIX a základy programování -2- Obsah  Skripty skripty vs programy, kompilace programu, spouštění programu a ukázkového skriptu  Proměnné nastavování a rušení proměnných, proměnné a procesy, typy řetězců C2110 Operační systém UNIX a základy programování -3- Skripty C2110 Operační systém UNIX a základy programování -4Programy vs Skripty zdrojový kód program vstup výstuppřeklad (kompilace) skript interpreter vstup výstup Program je soubor strojových instrukcí zpracovávaných přímo procesorem. Program vzniká překladem zdrojového kódu programovacího jazyka. Překládané jazyky: C/C++ Fortran Skript je textový soubor obsahující příkazy a řídící sekvence, které jsou vykonávány interpreterem použitého skriptovacího jazyka. Skriptovací jazyky: bash gnuplot awk JavaScript PHP C2110 Operační systém UNIX a základy programování -5Programy vs Skripty, ... nevyžaduje rekompilaci vytváření samospustitelného kódu špatná optimalizovatelnost pomalejší vykonávání snadná optimalizace rychlé vykonávání nutnost rekompilace nelze vytvářet samospustitelný kód zdrojový kód program vstup výstuppřeklad (kompilace) skript interpreter vstup výstup C2110 Operační systém UNIX a základy programování -6V čem psát skripty a programy Jelikož jsou skripty a zdrojové kódy programů textové soubory, lze použít libovolný textový editor umožňující uložení textu v čisté formě (bez formátovacích metadat). Textové editory:  vi  kwrite  kate  gedit K psaní skriptů a zdrojových kódů programů lze používat i specializované vývojové prostředí – IDE (Integrated Development Enviroment). IDE obsahuje kromě editoru i správce projektu, ladící nástroje (debugger) a další. Většinou dostupné pro komplexnější jazyky: JavaScript, Python, PHP, atd. Vývojové prostředí:  kdevelop  NetBeans  Eclipse C2110 Operační systém UNIX a základy programování -7Program v jazyce C #include int main(int argc,char* argv[]) { printf("Tohle je program v jazyce C!\n"); return(0); } Kompilace $ gcc program.c -o program Zdrojový kód Spuštění programu $ ./program kompiler jazyka C název souboru s vytvořeným programem soubor program musí mít práva pro spuštění C2110 Operační systém UNIX a základy programování -8Program ve Fortranu program Hello write(*,*) 'Toto je program ve Fortranu!' end program Kompilace $ gfortran program.f90 -o program Spuštění programu $ ./program kompiler jazyka Fortran název souboru s vytvořeným programem Zdrojový kód soubor program musí mít práva pro spuštění C2110 Operační systém UNIX a základy programování -9Skript v Bashi #!/bin/bash echo 'Toto je skript v interpretu Bash!' Spuštění skriptu interpret Bash soubor skript.bash nemusí mít práva pro spuštění Skript $ bash skript.bash C2110 Operační systém UNIX a základy programování -10Skript v GNUPlotu #!/usr/bin/gnuplot set title "Toto je skript v GNUPlotu!" plot sin(x) pause -1 Spuštění skriptu interpret GNUPlot soubor skript.gnuplot nemusí mít práva pro spuštění Skript $ gnuplot skript.gnuplot C2110 Operační systém UNIX a základy programování -11- Cvičení 1. Vytvořte čtyři adresáře s názvy ukol01, ukol02, ukol03, ukol04 2. Do jednotlivých adresářů uložte postupně soubory program.c , program.f90, skript.bash, a skript.gnuplot z adresáře /home/kulhanek/Data/programs 3. Zkompilujte zdrojové kódy programů napsaných v jazyce C a Fortran. Ověřte, že vzniklé programy lze spustit. 4. Jaká je velikost souboru obsahující výsledný program vzniklý kompilací zdrojového kódu v jazyce C. Otevřete vzniklý soubor v textovém editoru. Co soubor obsahuje? 5. Ověřte funkčnost skriptů skript.bash a skript.gnuplot jejich spuštěním. C2110 Operační systém UNIX a základy programování -12Spouštění skriptů 1) Nepřímé spouštění Spouštíme interpreter jazyka a jako argument uvádíme jméno skriptu. $ bash muj_skript_v_bashi $ gnuplot muj_skript_v_gnuplotu Skripty nemusí mít nastaven příznak x (executable). 2) Přímé spouštění Spouštíme přímo skript (shell automaticky spustí interpreter). $ ./muj_skript_v_bashi $ ./muj_skript_v_gnuplotu Skripty musí mít nastaven příznak x (executable) a interpreter (součást skriptu). C2110 Operační systém UNIX a základy programování -13Určení interpretru #!/bin/bash echo "Toto je skript v bashi!" #!/usr/bin/gnuplot set xrange[0:6] plot sin(x) pause -1 Skript v bashi Skript v gnuplotu #!/absolutní/cesta/k/interpretru/skriptu Specifikace interpretru (první řádek skriptu):  Pokud není interpreter skriptu při jeho přímém spuštění uveden, použije se interpreter systémového shellu.  Interpreter uvedený ve skriptu se ignoruje při nepřímém spuštění. C2110 Operační systém UNIX a základy programování -14Určení interpretru, II #!/usr/bin/env interpreter Pokud se absolutní cesta k interpretru mění (např. při použití softwareových modulů), lze použít následující konstrukci: Interpreter musí být v některém adresáři určeném systémovou proměnnou PATH. #!/usr/bin/env bash echo "Toto je skript v bashi!" #!/usr/bin/env gnuplot set xrange[0:6] plot sin(x) pause -1 Skript v bashi Skript v gnuplotu C2110 Operační systém UNIX a základy programování -15- Cvičení 1. Změňte přístupová práva u souborů skript.bash a skript.gnuplot (příkaz chmod). 2. Ověřte, že lze skripty spustit přímo bez uvedení interpretru. 3. Co se stane, pokud k interpretaci skriptu skript.gnuplot použijete interpretr bash? C2110 Operační systém UNIX a základy programování -16- Proměnné C2110 Operační systém UNIX a základy programování -17- Proměnné V jazyce Bash se proměnnou rozumí pojmenované umístění v paměti, které obsahuje hodnotu. Hodnota proměnné v jazyce Bash je vždy typu řetězec (text). Nastavení proměnné: $ JMENO_PROMENNE=hodnota $ JMENO_PROMENNE="hodnota s mezerami" Přístup k hodnotě proměnné: $ echo $JMENO_PROMENNE Zrušení proměnné: $ unset JMENO_PROMENNE Přehled všech proměnných: $ set nesmí být mezera mezi jménem proměnné a = C2110 Operační systém UNIX a základy programování -18Proměnné a procesy Proměnné Proces: pid, ppid Proces: pid, ppid Proměnné rodičovský proces dceřiný proces Každý proces má vyhrazenou část pro ukládání hodnot proměnných. Dceřiný proces v okamžiku svého spuštění získá kopii proměnných (exportovaných) a jejich hodnot od rodičovského procesu. Tyto proměnné může dle potřeby měnit nebo mazat. Dále může nastavovat nebo mazat nové proměnné. Všechny tyto změny však po skončení dceřiného procesu zaniknou. Export proměnné: $ export JMENO_PROMENNE $ export JMENO_PROMENNE="hodnota" export export s přiřazením C2110 Operační systém UNIX a základy programování -19- Řetězce V jazyce Bash lze použít čtyři typy řetězců: • bez uvozovek A=pokus B=* C=$A • s uvozovkami A="pokus hokus" B="* $A" • s jednoduchými uvozovkami (apostrof) A='pokus hokus' B='* $A' • s obracenými jednoduchými uvozovkami (obrácený apostrof) A=`ls –d` B="pocet : `ls | wc –l`" nahradí se seznamem souborů a adresářů, které jsou v aktuálním adresáři (lze použít složitější kontrukce) nahradí se hodnotou proměnné A nahradí se hodnotou proměnné A, hvězdička se neexpanduje (je uvedena v uvozovkách) text je uveden přesně, bez žádné expanze či transformace hodnota proměnně obsahuje dvě slova oddělené mezerou do místa obrácených uvozovek se vloží výstup příkazu uvedeného v uvozovkách C2110 Operační systém UNIX a základy programování -20- Cvičení 1. Nastavte proměnnou A na hodnotu 55. 2. Vypište hodnotu proměnné A (příkaz echo) 3. Vylistujte všechny proměnné. Je mezi nimi proměnná A (pokuste se použít příkaz grep a rouru)? 4. Změňte hodnotu proměnné na "tohle je dlouhy retezec". 5. Vypište hodnotu proměnné A. 6. Zrušte proměnnou A. 7. Ověřte, že jste proměnnou zrušili (postupem řešeným v bodě 3). 8. Postupně nastavujte proměnné A, B a C podle příkladů uvedených na předchozí straně. Postupně ověřujte jejich hodnotu.