Kolář lab at UCT Prague

První víkend s Linuxem
The first weekend with Linux

last update 2020-08-31

Undergraduate students often come to me with their interest in computational chemistry and/or biomolecular dynamics. It is a fascinating research area indeed, but I somewhat feel that the beginning is either hard or slow. So far, I haven't found an effective way to start investigating molecules without a decent knowledge of bash, python, and some specific computational chemistry program. I know there are many tutorials with toy models with known output to reproduce, etc., but I find such work less attractive than pure exploration. Hence I wrote this Linux intro suited specifically for what we do in my group at UCT. To decrease the activation barrier even more, it's in Czech. I hope you'll find English resources, should your Czech be poorer than bash.

Disclaimer

Stravitelnost textu je pro mě důležitější než kompletnost informací. Nemám zájem tady do detailu popisovat všechna střevní zákoutí Linuxu, i když by to mohlo být v některých případech fakticky přesnější. Google it, když narazíte na něco podezřelého nebo zajímavého. Libovolné komentáře a opravy chyb uvítám emailem na . Nemůžu také vyloučit, že text budu průběžně rozšiřovat, nebo že se přerodí do nějaké živé verze.

Několik úvodních sdělení

Linux je operační systém. Tady jsou hlavní rozdíly oproti Windows, se kterými, předpokládám, má člověk nějakou zkušenost:

Když chce člověk začít s Linuxem, musí si vybrat distribuci a grafické prostředí. Já už přes 10 let používám Ubuntu. Poslední roky s grafickým prostředím MATE. Výhodou je, že instalace je intuitivní a pro začátečníka obvykle bezproblémová (ala „Tohle zvládne i slepice, když jí kolem klávesnice nasypete zrní.“).

Linux je moderní operační systém a tím myslím, že v něm najdete všechny "moderní" technologie. Ovládá se myší (prostředí je klikací), podporuje dotykové obrazovky, umí přehrávat videa, připojit se na YouTube, Instagram, umí editovat tabulky, upravovat fotografie. Co se týká webu a programování, umí prakticky všechno.

Od teď budu předpokládat, že se vám povedlo nějakou distribuci nainstalovat nebo že vám s tím někdo pomohl.

„Příkazy“

Kromě klikání na okna, podobně jako ve Windows, se spousta věcí v Linuxu dá řešit přes příkazovou řádku. Bohužel pro začátečníky řadíme mezi onu "spoustu věcí" i ovládání výpočetních programů pro (bio)chemii (Gaussian, Gromacs, atp.). Příkazová řádka je běžný program, který se spustí např. dvojklikem na ikonu na ploše. Obsahem jeho okna je černá obrazovka, do které se dá psát, a která na oplátku vypisuje různé odpovědi. Téhle černé obrazovce říkáme terminál a dá se pomocí něj ovládat počítač bez grafického prostředí. Na většině distribucí jej lze spustit klávesovou zkratkou Ctrl+Alt+T.

Program MATE Terminal v distribuci Ubuntu. Ano, můj počítač se jmenuje racek.

Program MATE Terminal v distribuci Ubuntu. A ano, můj počítač se jmenuje racek.

Nadpis Příkazy je v uvozovkách záměrně. V okně terminálů totiž běží prostředí, kterému se říká shell. Shellů existuje několik, my budeme používat bash (Bourne-again Shell). Příkazy v bashi jsou vlastně malé programy určené k jedné specifické činnosti. Příkaz/program ls např. vypisuje obsah adresáře. Zní to banálně, ale program se musí vyrovnat z různými nástrahami, které se mohou objevit (např. že je adresáři v průběhu vypisování obsahu změněno jiným programem jméno).

Příkazy ls a cd

Teď na několika málo příkazech ukážu, jak to celé funguje. Otevřete si terminál; měla by se objevit černá obrazovka a na jí příkazový řádek s nějakou úvodní sadou znaků. Často třeba uživatel@jménoPC:. Tady budu používat $>, protože to je kratší. Napište příkaz ls (z angl. list), který vypíše obsah adresáře. V základním nastavení v anglickém Ubuntu je to několik dalších adresářů.


 $> ls
 Desktop Documents Downloads Music Pictures Public Templates Videos 
    

Do adresáře se dá přemístit příkazem cd (z angl. change directory). Přejděte do adresáře Documents. Asi bude prázdný, o čemž se můžete přesvědčit dalším příkazem ls.


 $> cd Documents
 $> ls
    

V adresářové struktuře se dá pohybovat s využitím .. (dvě tečky). Ty značí vyšší adresářovou úroveň.


 $> cd ..
 $> ls
 Desktop Documents Downloads Music Pictures Public Templates Videos 
    

Mnoho programů má tzv. přepínače. Ty obvykle začínají -- (dva spojovníky). Někdy mají zkrácené verze začínající - (jeden spojovník). Formátovaný obsah adresáře lze vypsat příkazem ls s přepínačem -l.


 $> ls -l
 total 322
 drwxr-xr-x  2 uzi grp   4096 apr  5 12:01 Desktop
 drwxr-xr-x 12 uzi grp   4096 apr 19 09:25 Documents
 drwxr-xr-x  5 uzi grp   4096 apr 19 18:52 Downloads
 drwxr-xr-x  6 uzi grp   4096 jun 14 11:27 Music
 drwxr-xr-x  4 uzi grp   4096 jan  1 09:50 Pictures
 drwxr-xr-x  2 uzi grp   4096 may 27 11:33 Public
 drwxr-xr-x  2 uzi grp   4096 jun 27 11:33 Templates
 drwxr-xr-x  4 uzi grp   4096 may 16 22:00 Videos
    

Pro běžné příkazy v bashi existuje seznam přepínačů a návod na použití. Lze jej zobrazit pomocí man a návod ukončit stisknutím q. Můžete zkusit zjistit, co dělají přepínače -t případně -lt a rovnou je vyzkoušet.


 $> man ls
 LS(1)                            User Commands                           LS(1)

 NAME
       ls - list directory contents

 SYNOPSIS
       ls [OPTION]... [FILE]...

 DESCRIPTION
       List  information  about  the FILEs (the current directory by default).
       Sort entries alphabetically if none of -cftuvSUX nor --sort  is  speci‐
       fied.

       Mandatory  arguments  to  long  options are mandatory for short options
       too.

       -a, --all
              do not ignore entries starting with .

       -A, --almost-all
              do not list implied . and ..
    

Některé programy používají stejné přepínače. Např. --help obvykle vypíše nápovědu, --version vypíše verzi programu.

Cesty

Každý soubor (a adresář) v Linuxu má své umístnění na pevném disku. Tato cesta může být buď absolutní, nebo relativní k jinému souboru (adresáři). Hlavní prostor pro soubory uživatele je jeho domovský adresář s absolutní cestou /home/jmenoUzivatele. Absolutní cesta vždy začíná / (lomítko). Lomítku se také někdy říká kořenový adresář. Všechna data (systémová, dočasná, uživatelů, atd.) jsou umístěna někde v kořenovém adresáři. Vyzkoušejte následující příkazy (výpisy zde neuvádím).


 $> cd /home
 $> ls
 $> ls /
    

Mnoho příkazů v bashi umí zpracovat absolutní nebo relativní cestu. Zkuste se pohybovat přes několik adresářových úrovní. Pokud použijete příkaz cd bez cesty, dostanete se do svého domovského adresáře. Aktuální adresář lze vypsat programem pwd (z angl. print working directory). Vyzkoušejte (výpisy neuvádím):


 $> cd /usr/local
 $> ls
 $> pwd
 $> cd ../../home
    

Tabulátor

Velice mocným pomocníkem při práci s terminálem je klávesa Tab (tabulátor). Ta umí doplňovat příkazy nebo cesty, případně poradit, jaký příkaz je k dispozici. Napište cd /ho a stiskněte Tab. Automaticky se doplní /home. Představte si, že chcete spustit program man (manuál a seznam přepínačů). Napište ma a stiskněte Tab. Nejspíš se nic nestane, protože příkazů začínajících na ma je víc a bash neví, který máte zrovna na mysli. Stikněte Tab dvakrát za sebou a bash vám nabídne všechny příkazy, které začínají na ma.

Tab používám téměř při každém příkazu. Dvakrát stisknu Tab, když nevím, jak vypadá adresářová struktura, do které se chci dostat. Opravdoví profící si namapují klávesu Tab třeba na levý Shift, aby to malíčkem „neměli tak daleko.“

Historie příkazů

Další mocnou funkcí terminálu/bashe je historie příkazů. Ta se dá vypsat na obrazovku pomocí history (schválně napište his a stiskněte Tab), ale lépe se k dříve napsaným příkazům přistupuje šipkou nahoru. Spustili jste příkaz a ten byl chybně? Nepište jej znova. Šipkou nahoru se k němu vraťte, opravte ho a znovu spusťte.

Základní příkazy

Následuje seznam základních příkazů. Je fajn jeden po druhém v terminálu vyzkoušet a případně s každým příkazem trochu zaexperimentovat. Řadím je subjektivně podle důležitosti/užitečnosti.

Midnight commander

Pohyb v adresářové struktuře pomocí příkazu cd nemusí být pro někoho úplně pohodlný. Ke stejnéhu účelu lze v terminálu použít příkaz mc. Ten obsahuje dva panely, levý a pravý, které zobrazují soubory a adresáře. Jeden z panelů je aktivní. Mezi panely lze přeskakovat pomocí Tab. Pomocí funkčních kláves F1 až F9 lze soubory zobrazovat, kopírovat, mazat atd. Význam jednotlivých funkčních kláves je na spodní straně obrazovky. Program se vypne stisknutím F10.

Tady je třeba zmínit, že u některých terminálů je klávesa F10 nastavena pro vstup do menu ona a na vypnutí Midnight Commander nefunguje. Dá se to vyřešit zrušením funkce F10 pro terminál, tj. naklikáním někde v Edit/Keyboard Shortcuts nebo Settings. Přesto vše lze mc vypnout i příkazem exit, který se zapisuje ve spodní části obrazovky.

Textový editor Nano

Nastavení Linuxu se provádí pomocí textových souborů. Ty jsou uloženy hluboko v adresářích, do kterých nebudeme moc vrtat. S nastavením to ale podobně platí i pro výpočetně chemické programy a ty už se nás týkat budou. Proto člověk potřebuje ovládat textový editor, který by fungoval v terminálu. Samozřejmě může použít i "neterminálový" editor, jako třeba Atom, ale ten potřebuje grafické prostředí, takže se nehodí např. na vzdálenou obsluhu počítačových klastrů, které obvykle žádné grafické prostředí nemají.

Já jsem uživatelem textového editoru vim. Abych nebyl zbytečně přísný, napíšu jen, že vim není příliš intuitivní. Proto začátečníkům doporučuji editor nano, jenž je evolučně vyspělejší verzí jeho předchůdce pico. Jak jsem se dočetl v jedné internetové diskuzi, tutoriál programu nano je stejně starý jako program sám a jmenuje se man nano. Navíc je nano tak jednoduchý, že stačí zmínit, že se ovládá pomocí kombinací klávesy Ctrl a písmen. Např. Ctrl+x pro vypnutí.

Skripty

Typická činnost při počítání (bio)molekul je spouštění různých výpočetních programů několikrát po sobě. Např. můžeme chtít pro několik molekul spočítat atomové náboje. Rádi bychom měli vše organizované v adresářích, chtěli bychom mít někde uložené vstupní a výstupní soubory, případně nastavení programů, abychom za půl roku, až budeme sepisovat bakalářskou/diplomovou práci nebo vědecký článek, měli náš postup dobře zdokumentovaný.

V takovou chvíli je nepraktické zapisovat příkazy bashe přímo do terminálu (do příkazového řádku). Daleko praktičtější by bylo je zapsat všechny do textového souboru a pak je spustit najednou. Takovým textovým souborům se říká skripty a často se chovají jako krátké programy. Např. můžeme chtít vytvoři adresář, nakopírovat do něj vstupní data, vstoupit do adresáře a spustit v něm program na počítání molekul. Jistě by to šlo vše zadat do příkazové řádky jedno po druhém. My ale vytvoříme soubor s příponou .sh a ten potom spustíme najednou. Pomocí nano vytvořte soubor s následujícím obsahem


 $> nano skript.sh
    

 #!/bin/bash

 pwd
 mkdir vypocet
 cd vypocet
 pwd
 cd ../..
 pwd
    

První řádek textového souboru je jakási zdravice. Říká, jaký program bude skript spouštět. V našem příkladu to bude bash.


 $> bash script.sh
 /home/uzivatel
 /home/uzivatel/vypocet
 /home
    

Do skriptů se dají vkládat komentáře. To jsou kusy textu, které bash nijak neinterpretuje. Komentář začíná vždy znakem # (hashkříž) a končí koncem řádku. Hashkříž samozřejmě funguje i mimo skript v příkazovém řádku. Tam ale nemá valný význam.


 $> # pwd
 $> pwd
 /home/uzivatel
    

Proměnné

V bashi lze využívat proměnné, čili dvojice název-hodnota, které zjednodušují nebo zpřehledňují skripty. Hodnota se k názvu proměmnné přiřazuje pomocí =, a to tak, že ani na jedné straně rovnítka není mezera. Proměnné fungují i v příkazové řádce. Jejich hodnotu lze dosadit do různých programů nebo vypsat na obrazovku pomocí znaku $ (dolar) před názvem proměnné. Je dobrým zvykem pojmenovávat proměnné velkými písmeny. Nelze vytvořit proměnnou, jejíž název začíná číslem. Vyzkoušejte:


 $> ADARESAR="novy-adresar"
 $> echo $ADRESAR
 novy-adresar
 $> pwd
 /home/uzivatel
 $> mkdir $ADRESAR
 $> cd $ADRESAR
 $> pwd
 /home/uzivatel/novy-adresar

    

Nejčastěji budeme pracovat s textovými proměnnými, mj. i z toho důvodu, že bash s čísly moc pracovat neumí. Typ proměnné se nijak nedeklaruje (poznámka pro programováním poskvrněné čtenáře). Několik desítek proměnných je definováno automaticky operačním systémem. Zkuste napsat echo $ a stisknout dvakrát Tab. Těmto se říká „proměnné prostředí“ (environment variables). Jsou dobrým sluhou, ale špatným pánem. Např. proměnná $HOME směřuje do vašeho /home adresáře. To se hodí ve chvíli, kdy chcete mít univerzální skript pro několik počítačů, na kterých vystupujete pod různými jmény. Srovnejte obsah následujících skriptů:


 $> cat skriptNaPc1.sh
 #/bin/bash

 cd /home/uzivatelNaPc1/projekt
 runCalculation
 
 $> cat skriptNaPc2.sh
 #/bin/bash

 cd /home/uzivatelNaPc2/projekt
 runCalculation
 
 $> cat univerzalniSkript.sh
 #/bin/bash

 cd $HOME/projekt
 runCalculation
 
    

Proměnná $PATH obsahuje dvojtečkami oddělené cesty ke spustitelným příkazům. Místo /usr/bin/ls tak stačí napsat je ls. Pokud se vám tedy (např. omylem) podaří obsah této proměnné smazat, bude oheň na střeše.

Speciální znak >

Komunikace uživatele s terminálem probíhá pomocí příkazů, které někdy vypisují na obrazovku data. Např. příkaz ls na obrazovku vypíše seznam souborů a adresářů. Příkazy/programy operují s dvěma výstupními kanály, které obvykle směřují na obrazovku: standardní výstup a chybový výstup. Lze je ale přesměrovat do souborů pomocí > (větší než).


 $> pwd
 /home/uzivatel
 $> ls
 Desktop Documents Downloads Music Pictures Public Templates Videos 
 $> ls > soubor.txt
 $> cat soubor.txt
 Desktop
 Documents
 Downloads
 Music
 Pictures
 Public
 Templates
 Videos 
 soubor.txt
    

Dovolím si poznament, že v seznamu se vyskytuje soubor.txt. To je zapřičiněno způsobem, jakým bash interpretuje daný řádek kódu. Nejdřív vytvoří výstupní soubor, a poté jej naplní pomocí >. Příkaz ls je tedy spuštěn až po vytvoření soubor.txt.

Jeden znak > přesměruje standardní výstup do nového souboru a pokud soubor již existuje, je jeho obsah vymazán a nahrazen novým obsahem. Dva znaky >> umí nový obsah připsat za starý obsah.

Pokud by program vypisoval data na chybový výstup, lze jej přesměrovat společně se standardním výstupem dvojicí znaků &> (ampersand a větší než). Následující příklad chce vypsat obsah adresáře a výpis přesměrovat do souboru. Protože adresář neexsituje, nahlásí chybu.


 $> pwd
 /home/uzivatel
 $> ls NeexistujiciAdresar
 ls: cannot access 'NeexistujiciAdresar': No such file or directory
 $> ls NeexistujiciAdresar > vypis.txt
 ls: cannot access 'NeexistujiciAdresar': No such file or directory
 $> cat vypis.txt
 $> ls NeexistujiciAdresar &> vypis.txt
 $> cat vypis.txt
 ls: cannot access 'NeexistujiciAdresar': No such file or directory
    

Závěr

Závěr žádný není. Je toho spousta, co nebylo ani naznačeno, takže je na každém, co si dohledá sám. Mám vizi text postupně doplňovat, ale víme všichni, jak je to s vizemi a jejich střetem s realitou.