Hrajeme si s Bashem na Windows. Proč ho fanoušci Linuxu tak milují?

  • Bash pro Desítky přinesl Linux na Windows
  • Je to výborná pomůcka pro vývojáře
  • Ale také skvělý trenažér pro začátečníky, kteří chtějí pochopit kouzlo textového Linuxu

Integrovaný linuxový příkazový řádek Bash je v testovacích verzích Windows už měsíc a za tu dobu prošel zajímavým vývojem. Naučil se pracovat s uživateli a právy, přibylo sudo a další integrální nástroje z Ubuntu.

Bash je ve Windows hlavně proto, aby pomohl vývojářům, kteří potřebují používat mnohé produktivní textové nástroje, kterým dneska roste pšenka hlavně na Linuxu, nicméně Bash není k zahození ani pro nás ostatní, poslouží totiž jako docela povedený trenažér Linuxu.

Před dvěma lety jsme publikovali článek se základním představením toho, jaké zajímavé kousky umí základní příkazová řádka ve Windows – Cmd. Pojďme se nyní optikou laika podívat na to, jaké základní zajímavé kousky umí obdobné příkazové shelly na unixových systémech a proč se tedy Linux v této oblasti těší natolik velké podpoře, že jej nakonec vzal na vědomí i Microsoft. Ale nebojte se, nebude to žádná učebnice Bashe.  

Tip: Jak povolit Bash na Windows 10

Apt-get

První skvělou věcí každé velké linuxové distribuce je nějaké to skladiště aplikací a jejich snadná instalace. Jestli slovíčko Store zpopularizovaly především chytré mobilní systémy, vězte, že ty linuxové s nimi pracují už léta letoucí.

Příkazová řádka Bash pro Windows 10 používá k běhu populární distribuci Ubuntu, která nabízí kouzelný nástroj apt-get. Když tedy budete chtít nainstalovat nějaký program (jehož název pochopitelně musíte vědět), stačí napsat třeba:

sudo apt-get install cowsay

Příkaz sudo vás požádá o heslo správce, protože instalace nových programů vyžaduje patřičná práva. Apt-get install cowsay poté nainstaluje veselý textový program cowsay, který nakreslí krávu s libovolnou textovou bublinou. Třeba:

cowsay Miluju Zive.cz
114327415
Textová kráva cowsay

Až vás testová kráva přestane bavit, můžete ji smazat příkazem:

sudo apt-get remove cowsay

Seznamy dostupných aplikací je třeba občas aktualizovat. To uděláte příkazem:

sudo apt-get update

A pokud budete chtít zjistit, jestli je daná aplikace vůbec na seznamu dostupných, můžete ji vyhledat příkazem:

apt-cache search cowsay

Kdybyste zadali:

apt-cache search .

Na obrazovku se začnou vypisovat jeden po druhém všechny dostupné balíčky. Ale pozor, bude jich ohromné množství, a než se vše vypíše, usnete nudou. Zpracovávání programu tedy můžete kdykoliv ukončit klávesovou zkratkou CTRL+D.

| a >

Jedním z hlavních kouzel ovládání počítače pomocí textové konzole je roura, kdy posíláme výstupy programů do jiných programů – filtrů, které je dále zpracovávají.

jedním z takových programů je grep, který projde textový vstup řádek po řádku a vypíše ten, který obsahuje hledané slovo. Když jsem tedy před chvílí nechal vypsat všechny balíčky pomocí apt-cache search ., mohl bych nyní rouru použít třeba tímto způsobem:

apt-cache search . | grep cowsay

Tímto příkazem vlastně říkám bashi, aby výpis všech dostupných programů nezobrazil na standardním výstupu (zpravidla monitoru), ale poslal jej do programu grep, který má jako parametr slovo cowsay. Grep pak vypíše všechny řádky z obrovského seznamu, které obsahují slovo cowsay.

835346991
Výpis všech dostupných balíčků jsem přesměroval do programu grep

Vedle roury můžete použít přesměrování, které se hodí tehdy, když potřebujete výstup z programu zapsat třeba do souboru.  Takže příkaz:

apt-cache search . > /mnt/c/users/cizek/vsechnybalicky.txt

uloží rozměrný seznam do běžného textového souboru a v tomto případě do mého uživatelského adresáře na Windows.

843463799
Přesměrování obrovského výstupu do textového souboru

Kdybych ale namísto > použil zdvojené >>, nepřepíše se původní soubor, ale výstup se připojí na jeho konec. To se hodí pro případy, kdy chcete průběžně zaznamenávat nějaké hodnoty a mít je všechny na jedné hromadě.

Wget

Další silnou zbraní textového světa je program wget, který dokáže stáhnout cokoliv z webu. Může to být libovolný binární i textový soubor. Když tedy napíšete třeba :

wget http://download.wifileaks.cz/data/wifileaks_150709.tsv

stáhnete 144MB soubor se všemi zaměřenými Wi-Fi hotspoty z projektu Wifileaks.

147010366
Wget je mocný hlavně pro svoji jednoduchost

Jelikož už známe funkci roury | a wget samotný má hromadu parametrů, můžeme jej chytře proměnit v program, který nám řekne, kolik stojí dolar. ČNB publikuje textový kurzovní lístek na této adrese.

Když zavoláte příkaz:

wget -qO- http://www.cnb.cz/cs/financni_trhy/devizovy_trh/kurzy_devizoveho_trhu/denni_kurz.txt | grep USD

wget stáhne textový soubor, díky parametrům -qO- jej ale neuloží do stejnojmenného souboru na lokální disk, ale rovnou vypíše do standardního výstupu. A jelikož jsem pomocí roury přesměroval výstup do programu grep, který hledá řádek s výrazem USD, vypíše se cena amerického dolaru.

63312682
Stažení souboru a vyhledání a vypsání kurzu dolaru

Alias

Hurá, máme vlastní příkaz, ale kdo by se s ním pokaždé psal, že? Proto má bash příkaz alias, který lze použít k vytvoření zkratky:

alias cnbkurzy='wget -qO- http://www.cnb.cz/cs/financni_trhy/devizovy_trh/kurzy_devizoveho_trhu/denni_kurz.txt'

Poté stačí napsat:

cnbkurzy | grep USD

a opět se vypíše řádek s cenou dolaru.

892566308
Příkaz s dlouhou adresou nahradí alias

Má to ale jeden háček. Alias vydrží jen tak dlouho, dokud nezavřete okno samotného bashe. Aby v něm vydržel už navždy, musíte jej uložit do souboru .bash_aliases ve vašem domácím linuxovém adresáři.

Jelikož už známe přesměrování >>, nemusíte ani otevírat textový editor (třeba příkazem nano .bash_aliases). Namísto toho stačí napsat:

echo "alias cnbkurzy='wget -qO- http://www.cnb.cz/cs/financni_trhy/devizovy_trh/kurzy_devizoveho_trhu/denni_kurz.txt'" >> .bash_aliases

Příkaz echo vypíše na standardní výstup samotný příkaz pro uložení aliasu ohraničený uvozovkami a samotný standardní výstup přesměrujeme na konec textového souboru .bash_aliases.

Teď už stačí pouze znovu spustit bash, který si po startu automaticky načte aliasy z našeho souboru.

Export

Vedle aliasů tu jsou samozřejmě I klasické proměnné. Namísto vytvoření zkratky pro celý příkaz bych tedy mohl uložit do proměnné pouze dlouhou adresu kurzovního lístku pomocí:

export kurzyurl=http://www.cnb.cz/cs/financni_trhy/devizovy_trh/kurzy_devizoveho_trhu/denni_kurz.txt

A proměnnou kurzyurl nyní mohu použít opět v programu wget třeba takto:

wget –qO- $kurzyurl

Všimněte si identifikátoru $, který bashi říká, že kurzyurl není webová adresa, ale proměnná, kterou má použít.

Pokud budete chtít proměnnou smazat, stačí napsat unset kurzyurl, nebo vypnout bash. Aby proměnná zůstala v bashi navždy, musíte ji opět uložit do některého skriptu, který se zpracovává po spuštění, což klidně může být i zmíněný .bash_aliases.

&&

Může se samozřejmě stát, že budete potřebovat do aliasové zkratky zapouzdřit vícero po sobě jdoucích samostatných příkazů, které se mají zpracovat v dávce. K tomu slouží pojítko &&.

797831116
Spuštění více příkazu v dávce po sobě

Curl a Transfer.sh

Zatímco wget slouží ke stahování z webu, další webový program curl lze použít i k nahrávání. Jenže kam takový soubor nahrát, že? Třeba na službu Transfer.sh, což je jakýsi jednoduchý, ale svým způsobem naprosto dokonalý dropbox pro milovníky bashe.

Když do příkazové řádky napíšete třeba:

curl --upload-file fotkyzdovolene.zip https://transfer.sh/fotkyzdovolene.zip

curl nahraje soubor fotkyzdovolene.zip v aktuálním adresáři na web a do příkazové řádky vypíše odkaz ke stažení. Je to zdarma, je to rychlé a je to náramně sexy. Nahrávaný soubor může mít až 14 GB a na úložišti vydrží 14 dnů.

814086894
Nejjednodušší možný dropbox pro fanoušky linuxového shellu

Transfer.sh samozřejmě nabízí i mnohem složitější příkazy, hromadné nahrávání souborů aj., především ale můžeme vytvořit i miniprogram, jehož kód opět uložíme třeba do .bash_aliases, abychom mohli službu volat o něco jednodušeji.

Stačí použít kód, který nabízí přímo sama služba:

transfer() { if [ $# -eq 0 ]; then echo "No arguments specified. Usage:\necho transfer /tmp/test.md\ncat /tmp/test.md | transfer test.md"; return 1; fi
tmpfile=$( mktemp -t transferXXX ); if tty -s; then basefile=$(basename "$1" | sed -e 's/[^a-zA-Z0-9._-]/-/g'); curl --progress-bar --upload-file "$1" "https://transfer.sh/$basefile" >> $tmpfile; else curl --progress-bar --upload-file "-" "https://transfer.sh/$1" >> $tmpfile ; fi; cat $tmpfile; rm -f $tmpfile; }

Toto je už trošku vyšší liga skriptování s využitím podmínek IF/THEN a opět proměnných, podstatné je ale to, že napříště stačí napsat:

transfer fotkyzdovolene.zip

a po nahrání se opět napíše adresa pro sdílení.

120398478
A přeci jen ještě jednodušší sdílení přes webové úložiště. A tentokrát i s indikátorem průběhu.

Výborný trenažér Linuxu

Linux je díky mocnému textovému skriptování neskutečně tvárný a většina grafických aplikací jsou pouhými nadstavbami textových programů a skriptů. A to je nakonec důvod, proč tento servis hodlá nabídnout Microsoft i svým uživatelům.

Bash pro Windows je v tomto směru dokonalé pískoviště, které je i docela bezpečné. Pokud jej rozbijete, poničíte si pouze integrované Ubuntu. Případné problémy ale napravíte příkazem:

lxrun /uninstall

který spustíte v klasické příkazové řádce Windows. V takovém případě se linuxový systém z Windows odinstaluje a vy poté budete moci provést opět čistou instalaci příkazem:

bash

Jelikož je ale do bashe na Windows napojený i souborový systém systémového oddílu C:, který v bashi najdete na cestě /mnt/c, dávejte si dobrý pozor, co do něj zapisujete. určité komplikace by mohl způsobit třeba pokus o spuštění příkazu:

rm -rf /

který zkusí smazat celý linuxový kořenový adresář /, ve kterém je vlastně naprosto vše včetně onoho /mnt/c.


A to má být jako vše? Zdaleka ne, až po sepsání devíti tisíc znaků jsem si totiž uvědomil, jak rozsáhlý bash vlastně je a že ani pouhý úvod nelze obsáhnout jediným článkem. Určitě se k němu tedy ještě vrátíme.

Diskuze (51) Další článek: Daně v Česku spravuje software z roku 1992, úředníci jsou z něj zoufalí

Témata článku: , , , , , , , , , , , , , , , , , , , , , , , , ,