Zdá se, že příkaz `yes` je až příliš jednoduchý na to, aby se dal prakticky využít. Nicméně, v tomto článku si ukážeme, jak ho lze aplikovat a jak těžit z jeho skryté síly v operačních systémech Linux a macOS.
Příkaz `yes`
Příkaz `yes` patří k těm nejjednodušším příkazům v Linuxu a dalších systémech vycházejících z Unixu, jako je například macOS. Jednoduchost zde chápeme jak v jeho používání, tak v samotné implementaci. Zdrojový kód pro původní verzi, která byla představena v System 7 Unix a jejímž autorem je Ken Thompson, se skládá z pouhých šesti řádků kódu.
Nenechte se ale zmást jeho jednoduchostí. Dá se využít velice zajímavým a užitečným způsobem.
Jak funguje `yes`?
Pokud spustíte příkaz `yes` bez jakýchkoli dalších parametrů, chová se tak, jako byste neustále dokola zadávali písmeno „y“ a stiskávali klávesu Enter. Dělá to velmi rychle a bude v tom pokračovat do té doby, než jej přerušíte stisknutím kláves Ctrl+C.
yes
Ve skutečnosti lze příkaz `yes` použít k opakovanému generování libovolného textu. Jednoduše zadejte `yes`, mezeru a text, který chcete opakovat, a stiskněte klávesu Enter. Často se to využívá pro generování nekonečného proudu textových řetězců „ano“ nebo „ne“.
yes yes
yes cokoli si přejete
K čemu je to dobré?
Výstup příkazu `yes` lze přesměrovat do jiných programů nebo skriptů.
Možná se vám už stalo, že jste spustili dlouhý proces a nechali ho běžet, ale po návratu k počítači jste zjistili, že se proces vůbec nedokončil. To proto, že se vás na něco zeptal a čeká na odpověď „ano“ nebo „ne“.
Pokud víte, že všechny vaše odpovědi budou kladné („ano“ nebo „y“) nebo záporné („ne“ nebo „n“), můžete použít příkaz `yes` k automatickému poskytnutí těchto odpovědí. Váš dlouhý proces tak poběží až do konce bez vašeho zásahu, protože příkaz `yes` za vás odpoví na všechny položené otázky.
`yes` ve skriptech
Podívejte se na následující skript v jazyce Bash. (Představte si, že je součástí mnohem většího skriptu, jehož spuštění zabere delší čas.)
#!/bin/bash # ... # uprostřed dlouhého skriptu # získáme odpověď od uživatele # ... echo "Chcete pokračovat? [y,n]" read input # dostali jsme nějaký vstup? if [ "$input" == "" ]; then echo "Uživatel nic nezadal" # bylo to "y" nebo "yes"? elif [[ "$input" == "y" ]] || [[ "$input" == "yes" ]]; then echo "Kladná odpověď: $input" # cokoli jiného bereme jako zápornou odpověď else echo "Záporná odpověď: $input" fi
Tento skript položí otázku a čeká na odpověď. Tok programu se odvíjí od vstupu uživatele.
„Ano“ nebo „y“ se považuje za kladnou odpověď.
Jakýkoliv jiný vstup se považuje za zápornou odpověď.
Stisknutí klávesy Enter bez jakéhokoli textu nemá žádný efekt.
Pro otestování zkopírujte skript do souboru a uložte jej jako `long_script.sh`. Poté nastavte spustitelný příznak pomocí příkazu `chmod`.
chmod +x long_script.sh
Spusťte skript pomocí následujícího příkazu. Vyzkoušejte zadat „ano“, „y“ a cokoliv jiného, včetně stisknutí klávesy Enter bez textu.
./long_script.sh
Chcete-li, aby na otázku ve skriptu odpověděl příkaz `yes`, přesměrujte jeho výstup do skriptu.
yes | ./long_script.sh
Některé skripty jsou v požadavcích striktnější a akceptují jako kladnou odpověď pouze celé slovo „ano“. V takovém případě použijte `yes` s parametrem „ano“:
yes yes | ./long_script.sh
Neříkejte `yes` bez rozmyslu
Musíte si být jistí, že vstup, který přesměrováváte do skriptu nebo programu, vám opravdu poskytne výsledek, který očekáváte. Než se rozhodnete, musíte vědět, jaké otázky program pokládá a jaké mají být vaše odpovědi.
Logika skriptu, příkazu nebo programu se nemusí shodovat s vašimi očekáváními. V našem příkladu skriptu mohla být otázka „Přejete si skončit? [y,n]“. V takovém případě by záporná odpověď umožnila skriptu pokračovat.
Než bezstarostně použijete `yes`, měli byste být obeznámeni s logikou daného skriptu, příkazu nebo programu.
Použití `yes` s příkazy
Dříve se příkaz `yes` běžně používal s dalšími příkazy v Linuxu. Postupem času ale většina těchto příkazů získala vlastní způsoby, jak se spustit bez nutnosti interakce s uživatelem. Proto už `yes` není k tomuto účelu tolik potřeba.
Jako příklad si vezměme správce balíčků `apt-get` v Ubuntu. Pokud jste chtěli nainstalovat aplikaci bez nutnosti stisknutí „y“ v průběhu instalace, mohli jste použít `yes` takto:
yes | sudo apt-get install fortune-mod
Stejného výsledku lze dosáhnout pomocí volby `-y` (předpokládej ano) v `apt-get`:
sudo apt-get -y install fortune-mod
Jak vidíte, `apt-get` se vás ani nezeptal na obvyklou otázku „Chcete pokračovat? [Y/n]“. Předpokládalo se, že odpověď bude „ano“.
Stejná situace platí i pro další distribuce Linuxu. Například ve Fedoře jste mohli dříve použít tento příkaz se správcem balíčků:
yes | yum install fortune-mod
Správce balíčků `dnf` nahradil `yum` a `dnf` má také vlastní volbu `-y` (předpokládej ano).
dnf -y install fortune-mod
Totéž platí i pro příkazy jako `cp`, `fsck` a `rm`. Každý z těchto příkazů má své vlastní volby `-f` (vynutit) nebo `-y` (předpokládej ano).
Zdá se tedy, že `yes` je omezen pouze na práci se skripty? Ne tak úplně. I starý pes má stále pár triků.
Další triky s `yes`
Příkaz `yes` můžete použít se sekvencí čísel generovaných pomocí `seq` k ovládání opakovaných akcí.
Následující příkaz vypíše vygenerované číslice do terminálu a poté na jednu sekundu pozastaví běh.
Místo pouhého vypisování číslic do terminálu můžete volat jiný příkaz nebo skript. Tento příkaz nebo skript nemusí číslice vůbec používat, slouží pouze ke spuštění jednotlivých cyklů smyčky.
yes "$(seq 1 20)" | while read digit; do echo $digit; sleep 1; done
Někdy je užitečné mít velký soubor pro testování. Můžete si například vyzkoušet použití příkazu `zip` nebo potřebujete velký soubor pro testování odesílání na FTP.
Pomocí `yes` můžete rychle generovat velké soubory. Stačí mu dát dlouhý text, který bude opakovat, a přesměrovat výstup do souboru. Buďte ale opatrní, tyto soubory rychle rostou. Buďte připraveni stisknout Ctrl+C během několika sekund.
yes dlouhý řádek nesmyslného textu pro výplň souboru > test.txt
ls -lh test.txt
wc test.txt
Soubor, který byl vygenerován při psaní tohoto článku, dosáhl velikosti 557 MB během asi pěti sekund. `ls` hlásí, že má velikost 557 MB a `wc` nám říká, že obsahuje 12,4 milionů řádků.
Velikost souboru můžeme omezit použitím příkazu `head`. Řekneme mu, kolik řádků má do souboru uložit. `-50` znamená, že `head` do souboru `test.txt` propustí pouze 50 řádků.
yes dlouhý řádek nesmyslného textu pro výplň souboru | head -50 > test.txt
Jakmile je v souboru `test.txt` 50 řádků, proces se zastaví. Není třeba používat Ctrl+C. Program se zastaví sám od sebe.
`wc` hlásí, že soubor má přesně 50 řádků, 400 slov a má velikost 2350 bajtů.
I když je stále užitečný pro vkládání odpovědí do dlouho běžících skriptů (a pro pár dalších triků), příkaz `yes` nebude součástí vaší každodenní sady příkazů. Když ho ale budete potřebovat, zjistíte, že je to jednoduchost sama, a to vše v šesti řádcích geniálního kódu.