{{indexmenu_n>4}} ====== Základy příkazové řádky ====== Příkazová řádka (anglicky shell) je univerzálním uživatelským rozhraním operačního systému. Umožňuje základní ovládání operačního systému (procházení adresářové struktury, práce se soubory, vyhledávání ...), poskytuje rozhraní uživatelským programům a hlavně umožňuje řetězit vstupy a výstupy jednotlivých programů. 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 programů, 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 obrazovku 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ákladní struktura příkazu: ''prikaz [argumenty]'' Příkaz může být název vestavěného příkazu BASHe nebo název externího programu, pro naše úč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ěží, 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. ====== Příkazy navigace v adresářové struktuře ====== ^ Příkaz ^ Používané přepínače ^ Windows ^ Význam ^ |''ls''| -l -t | ''dir'' | vypíše obsah aktuálního pracovního adresáře | |''cd''| | ''cd'' | změní aktuální pracovní adresář | |''pwd''| | ''cd'' | vypíše absolutní adresu aktuálního pracovního adresáře | |''tree''| | ''tree'' | vypíše strukturu aktuálního pracovního adresáře včetně podadresářů formou stromu| ====== Příkazy práce se soubory a adresáři ====== ^ Příkaz ^ Používané přepínače ^ Windows ^ Význam ^ |''mkdir''| | ''mkdir'' | vytvoří adresář zadaného jména| |''cp''| -r | ''copy'' | zkopíruje soubor (adresář) zadaného jména| |''mv''| | ''move'' | přesune soubor zadaného jména | |''rm''| | ''del'' | odstraní soubor zadaného jména| |''rm''| -r -f | ''rmdir /S'' | odstraní adresář| |''touch''| | | vytvoří soubor zadaného jména | ====== Ostatní důležité příkazy ====== ^ Příkaz ^ Používané přepínače ^ Windows ^ Význam ^ |''man''| | | vypíše manuálovou stránku zadaného příkazu | |''find''| | | vyhledá soubor zadaného jména v aktuálním adresáři| |''locate''| | | jako ''find'', ale hledá v kompletní adresářové struktuře | |''cat''| | ''type'' | vypíše obsah souboru jako text | |''hexdump''| -C | ''fc'' | vypíše obsah souboru v hexadecimálním tvaru doplněný o adresy paměti |