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:
- Windows v jeden časový okamžik existují v jedné konkrétní verzi (např Win 10). Oproti tomu existuje mnoho "mutací" Linuxu, kterým se říká distribuce. Distribuce se mezi sebou nejčastěji liší vnitřním nastavením, sadou programů, které jsou na začátku k dispozici, instalačním procesem, velikostí komunity a logem. Každá distribuce pak existuje v různých verzích (číslovaných podobně jako Win). Mezi rozšířené distribuce patří např. Ubuntu, Fedora, Debian, celkově jsou jich ale stovky. Distribuce je jako ta část auta schovaná pod kapotou. Každý motor umí roztočit kola tím že spaluje směs organických látek, ale někde je k tomu potřeba turbo, některý motor je dvoutakt, některý má 12 válců...
- Pro jednu distribuci může existovat několik grafických prostředí. Mezi běžná grafické prostředí patří Gnome, KDE, XCDE. Vznikají tak "příchutě" (flavors), u distribuce Ubuntu např. Kubuntu (s KDE) a Xubuntu (s XFCE). Grafické prostředí je vnějšek operačního systému. Definuje, jak vypadají okna programů, jaká je ovládací lišta, obdoba tlačítka "Start", jak vypadá "App store" neboli balíčkovací systém atp.
- Linux je zadarmo. Existuje pár placených distribucí, ale u nich se obvykle platí za servis, tj. instalaci, správu, poradenství...
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. 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.
-
ls
: (z angl. list) vypíše obsah adresáře. -
cd adresar
: (z angl. list) vypíše obsah adresáře. -
man prikaz
: vypíše manuál programu, pokud manuál existuje. Použije se např. jakoman ls
. -
pwd
: vypíše absolutní cestu aktuálního umístění. -
mkdir adresar
: vytvoří adresář. -
rmdir adresar
: smaže prázdný adresář. -
cp odkud/co kam
: zkopíruje soubor. S přepínačem-r
i adresář. -
mv odkud/co kam
: přesune soubor. Pokud co a kam jsou ve stejném adresář, příkazmv
soubor přejmenuje. -
rm soubor
: smaže soubor. S přepínačem-r
smaže i neprázdný adresář. -
cat soubor.txt
: vypíše obsah souboru na obrazovku. -
head soubor.txt
: vypíše začátek souboru na obrazovku. -
tail soubor.txt
: vypíše konec souboru na obrazovku. -
echo "text"
: vypíše text -
ps
: vypíše běžící programy (procesy). -
top
: vypíše běžící procesy v reálném čase. Vypne se stisknutímq
. -
kill
: vypne proces. Je nutné znát ID procesu, které lze zjistit např. programemps
-
ssh ipAdresa
: připojí se vzdáleně na počítač s IP adresou. Na cílovém počítači musí běžet SSH -
grep "text" soubor
: program typu filtr.grep
otevře soubor, projde jej řáden po řádku a vypíše všechny řádny, na kterých naleznetext
. Lze jej použít i pro složitější vyhledávání. -
sed "příkaz" soubor
: program typu filtr.sed
pro každý řádek souboru provede příkaz. Typicky se používá pro vyhledání textu a jeho nahrazení jiným textem. -
mc
: spustí Midnight Commander.
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.