{{indexmenu_n>2}} ====== Základy příkazové řádky ====== Příkazová řádka (anglicky shell) je univerzálním uživatelským rozhraním operačního systému. Na všech POSIXových operačních systémech (Linux, BSD, MacOS, Unix,..) je rozhraní tak podobné že se s ním naučíte pouze jednou. Je primárním rozhraním pro mnoho progamů, například kompilátoru (a to i na windows). V tomto článku se budeme bavit konkrétně o příkazové řádce **BASH**, která je výchozí na Ubuntu a většině ostatních linuxových distribucích a i na MacOS. Do příkazové řádky se dostanete (na Ubuntu a MacOS) pomocí programu Terminal, který spustíte běžným způsobem přes dash nebo spotlight. Na Ubuntu je výchozí zkratka ''Ctrl+Alt+T''. Ve Windows existuje příkazová řádka cmd.exe, pomocí které lze též ovládat kompiler. Cmd.exe lze spustit pomocí dialogového okna Run: ''Win+R, cmd, Enter''. Cmd.exe se ale velmi liší od BASHe a bude pro vás mnohem jednodušší pracovat s WSL. Ten si můžete nainstalovat podle [[https://docs.microsoft.com/en-us/windows/wsl/install-win10|návodu zde]]. ====== Základní syntax ===== BASH je jednoduchý programovací jazyk, ve kterém jdou psát i poměrně složité programy. Ale pro naší potřebu nám stačí pochopit jenom dva, tři základní principy. Rozhraní k BASHi je příkazová řádka, command line, nebo taky REPL (Read Evaluate Print Loop). Vše se děje tak, že píšete do okna a po stisknutí enteru se provede jeden řádek vašeho "programu" a vypíše se na abrazovku jeho výstup. Typicky BASH vypíše na obrazovku //prompt// když čeká na váš vstup, ten většinou vypadá jako ''tvojejmeno@hostname:~$'', v tomto textu budu zkracovat jenom jako ''$''. Základy syntaxe BASH volání příkazu, které se skládá ze jména příkazu následovaného argumenty oddělenými mezerami zakončené novým řádkem. příkaz argument1 argument2 argument3 ... Příkaz může být název vestavěného příkazu BASHe nebo název externího programu, pro naše učely v tom není rozdíl a můžeme klidně tvrdit, že každý příkaz je jeden program. Zkuste použít příkaz ''echo'' (ozvěna) s různými argumenty. Měl by se chovat stejným způsobem jako je znázorněno tu: $ echo $ echo Hello PRP! Hello PRP! $ Většina programů umí víc věcí než echo. Pro specifikování možností, se kterými program poběži se používá konvence takzvaných vlajek (flags) nebo možností (options). Konvence říká že argumenty ve tvaru ''-x'' (kde x je nějaké písmeno) nebo ''--long-option'' upravují chování programu. Zdůrazňuji, že je to pouze konvence a některé programy se mohou (budou) chovat jinak, ale většina programů se jí drží. Nejpraktičtější vlajku kterou bude znát většina programů (v závislosti na systému možná i echo) je ''-h'' nebo ''--help''. Vyzkoušejte si pracovat s příkazy ''ls'', ''pwd'', ''whoami'', ''cd''. Každý z nich umí možnost ''--help''. $ cd --help cd: cd [-L|[-P [-e]] [-@]] [dir] Change the shell working directory. Change the current directory to DIR. The default DIR is the value of the HOME shell variable. The variable CDPATH defines the search path for the directory containing DIR. Alternative directory names in CDPATH are separated by a colon (:). A null directory name is the same as the current directory. If DIR begins with a slash (/), then CDPATH is not used. If the directory is not found, and the shell option 'cdable_vars' is set, the word is assumed to be a variable name. If that variable has a value, its value is used for DIR. Options: -L force symbolic links to be followed: resolve symbolic links in DIR after processing instances of '..' -P use the physical directory structure without following symbolic links: resolve symbolic links in DIR before processing instances of '..' -e if the -P option is supplied, and the current working directory cannot be determined successfully, exit with a non-zero status -@ on systems that support it, present a file with extended attributes as a directory containing the file attributes The default is to follow symbolic links, as if '-L' were specified. '..' is processed by removing the immediately previous pathname component back to a slash or the beginning of DIR. Exit Status: Returns 0 if the directory is changed, and if $PWD is set successfully when -P is used; non-zero otherwise. $ ===== Manuálové stránky ===== Jediný příkaz který opravdu potřebujete znát je ''man''. Ten otevírá manuálové stránky. Například když chcete vědět s jakou vlajkou se zapne výpis varování pro ''gcc'' (GNU Compiler Collection), stačí zavolat $ man gcc Man najde v systémových manuálových stránkách záznam, který se týká gcc. Protože manuálové stránky bývají hodně obsáhlé, zobrazí je man v //pageru//, což je program který umožnuje snadné scrollování a hledání v dlouhém textu. Základní ovládání je pomocí šipek nahoru a dolu, page-up, page-down, ''h'' pro nápovědu a ''q'' pro opuštění pageru. Manuálové stránky jsou šikovné i jako reference pro programování v C. V sekci 3 jsou popsané téměř všechny funkce standardní knihovny C. Do sekce 3 se dostanete tak, že jí specifikujete jako první argument programu man. Například $ man 3 printf otevře manuálovou stránku funkce printf() a příbuzných. ====== Adresářová struktura ====== Hierarchie adresářů (složek) a souborů je uvnitř počítače reprezentována pomocí stromu. Při práci s adresáři rozlišujeme mezi absolutními a relativními adresami. Relativní adresa popisuje cestu z aktuálního adresáře. Nechť se nacházíme uvnitř adresáře bin ve složce Lab03 a chceme znát adresu k souboru notes ve složce Lab01. Relativní adresa (vůči aktuálnímu pracovnímu adresáře) je ../../Lab01/notes.txt a absolutní adresa je /home/kubikj/PRP/Lab01/notes.txt. {{:courses:b0b36prp:tutorials:adresare.png|}} ====== Příkazy ====== ===== pwd (print working directory) ===== Příkaz pwd vypíše absolutní adresu aktuálního pracovního adresáře. {{:courses:b0b36prp:tutorials:pwd.png?600|}} ===== ls (list) ===== Tento příkaz vypíše jména všech souborů a složek uvnitř aktuálního pracovního adresáře. {{:courses:b0b36prp:tutorials:ls.png?600|}} ===== cd (change directory) ===== Tento příkaz změní aktuální pracovní adresář. Za klíčové slovo cd lze napsat absolutní adresu i relativní adresu. Dvě tečky za klíčovým slovem cd přesunou aktuální prcovní adresář do nadřazeného adresáře. {{:courses:b0b36prp:tutorials:cd.png?600|}} Povšimněme si, že dvě tečky (..) lze použít i vícenásobně. Poslední příkaz cd se vrátí o dva adresáře výše (tj do složky PRP) a odtud se přesune do složky lab02. ===== ostatní příkazy ===== Příkaz **mkdir** (make directory) vytvoří adresář daného jména uvnitř aktuálního pracovního adresáře. Příkaz **rmdir** (remove directory) smaže adresář daného jména, ovšem pouze v případě, že je tento adresář prázdný. Příkaz **clear** vymaže obrazovku příkazové řádky. Pomocí tabulátoru lze uvnitř příkazové řádky doplňovat slova. Příkaz **touch** se "dotkne" souboru nebo adresáře, což znamená, že změní datum poslední změny na aktuální systémové datum a v případě neexistence souboru nebo adresáře ho vytvoří. {{:courses:b0b36prp:tutorials:mkdir_touch.png?600|}} Pomocí šipky nahoru a šipky dolu lze procházet historii zadaných příkazů. Klávesa tabulátor doplňuje názvy souborů a složek. Příkaz man a jméno příkazu otevře jeho manuál.