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
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.
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.
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.
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.
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.
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 &&.
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ů.
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í.
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.