Jak používat příkaz yes v systému Linux

Příkaz yes se zdá být příliš jednoduchý na to, aby byl prakticky použitelný, ale v tomto tutoriálu vám ukážeme jeho aplikaci a jak těžit z jeho zadržované pozitivity v Linuxu a macOS.

Příkaz ano

Příkaz yes je jedním z nejjednodušších příkazů v Linuxu a dalších operačních systémech podobných Unixu, jako je macOS. A pod pojmem jednoduchý máme na mysli jednoduchý v jeho použití a jeho prvotní implementaci. Zdrojový kód pro původní verzi – vydaný v System 7 Unix a autorem Ken Thompson– činí pouhé šest řádků kódu.

Ale neodepisujte to, že je to jednoduchý malý příkaz. Dá se použít zajímavými a užitečnými způsoby.

Co dělá yes?

Při použití bez jakýchkoli parametrů příkazového řádku se příkaz yes chová, jako byste psali „y“ a makali Enter, znovu a znovu (a znovu a znovu). Velmi rychle. A bude v tom pokračovat, dokud jej nepřerušíte stisknutím Ctrl+C.

yes

Ve skutečnosti lze ano použít k opakovanému generování jakékoli zprávy, kterou si vyberete. Jednoduše zadejte ano, mezeru, řetězec, který chcete použít, a stiskněte Enter. To se často používá k tomu, aby se vygeneroval výstupní proud řetězců „ano“ nebo „ne“.

yes yes

yes anything you like

Ale k čemu to je?

Výstup z yes může být přenesen do jiných programů nebo skriptů.

Zní vám to povědomě? Spustíte běh dlouhého procesu a odstoupíte a necháte jej běžet. Když se vrátíte k počítači, proces nebyl vůbec dokončen. Ve vaší nepřítomnosti se vás na něco zeptal a čeká na odpověď „ano“ nebo „ne“.

Pokud předem víte, že všechny vaše odpovědi budou kladné („ano“ nebo „y“) nebo záporné („ne“ nebo „n“), můžete použít ano a poskytnout tyto odpovědi za vás. Váš dlouhý proces pak proběhne až do dokončení bez dozoru, přičemž ano a poskytne odpovědi na všechny otázky, které proces klade.

Použití ano se skripty

Podívejte se na následující skript prostředí Bash. (Musíme si představit, že se jedná o součást mnohem většího skriptu, jehož spuštění zabere značnou dobu.)

#!/bin/bash

# ...
# in the middle of some long script
# obtain a response from the user
# ...

echo "Are you happy to proceed? [y,n]"
read input

# did we get an input value?
if [ "$input" == "" ]; then

   echo "Nothing was entered by the user"

# was it a y or a yes?
elif [[ "$input" == "y" ]] || [[ "$input" == "yes" ]]; then

   echo "Positive response: $input"

# treat anything else as a negative response
else

   echo "negative response: $input"

fi

Tento skript položí otázku a čeká na odpověď. O logickém toku ve skriptu rozhoduje vstup od uživatele.

„Ano“ nebo „y“ značí kladnou odpověď.
Jakýkoli jiný vstup je považován za negativní odpověď.
Stisknutí klávesy Enter bez vstupního textu nic nedělá.

Chcete-li to vyzkoušet, zkopírujte skript do souboru a uložte jej jako long_script.sh. Použijte chmod, aby byl spustitelný.

chmod +x long_script.sh

Spusťte skript pomocí následujícího příkazu. Zkuste zadat „ano“, „y“ a cokoli jiného jako vstup, včetně stisknutí klávesy Enter bez vstupního textu.

./long_script.sh

Chcete-li získat odpověď ano, abyste odpověděli na otázku skriptu, přesuňte výstup z ano do skriptu.

yes | ./long_script.sh

Některé skripty jsou ve svých požadavcích přísnější a přijímají pouze úplné slovo „ano“ jako pozitivní odpověď. Můžete zadat „ano“ jako parametr pro ano, a to následovně:

yes yes | ./long_script.sh

Neříkejte ano, aniž byste si to promysleli

Musíte si být jisti, že vstup, který se chystáte vložit do skriptu nebo programu, vám určitě poskytne výsledek, který očekáváte. Abyste se mohli rozhodnout, musíte znát otázky a jaké by měly být vaše odpovědi.

Logika ve skriptu, příkazu nebo programu nemusí odpovídat vašim očekáváním. V našem vzorovém skriptu mohla být otázka „Přejete si přestat? [y,n].“ Pokud by tomu tak bylo, negativní odpověď by umožnila skriptu pokračovat.

Musíte být obeznámeni se skriptem, příkazem nebo programem, než do něj bezstarostně zadáte ano.

Použití yes With Commands

V plenkách by se yes používal s jinými příkazy Linuxu. Od té doby má většina těch ostatních linuxových příkazů svůj vlastní způsob spouštění bez lidské interakce. ano, k dosažení toho již není zapotřebí.

Vezměme si jako příklad správce balíčků Ubuntu apt-get. Chcete-li nainstalovat aplikaci, aniž byste museli stisknout „y“ v polovině instalace, ano by bylo použito následovně:

yes | sudo apt-get install fortune-mod

Stejného výsledku lze dosáhnout pomocí volby -y (předpokládejme ano) v apt-get:

sudo apt-get -y install fortune-mod

Uvidíte, že apt-get se ani nezeptal na své obvyklé „Chcete pokračovat? [Y/n]“ otázka. Předpokládalo se, že odpověď bude „ano“.

Na jiných distribucích Linuxu je situace stejná. Na Fedoře byste najednou použili tento typ příkazu správce balíčků:

yes | yum install fortune-mod

Správce balíčků dnf nahradil yum a dnf má vlastní volbu -y (předpokládejme, že ano).

dnf -y install fortune-mod

Totéž platí pro cp, fsck a rm. Každý z těchto příkazů má své vlastní volby -f (vynutit) nebo -y (předpokládejme ano).

Zdá se tedy, že ano bylo odkázáno pouze na práci se skripty? Ne tak docela. Na starého psa je ještě pár triků.

Některé další ano triky

Ano můžete použít se sekvencí číslic generovaných seq k ovládání smyčky opakovaných akcí.

Tento jednořádkový modul odešle generované číslice do okna terminálu a poté na jednu sekundu vyvolá režim spánku.

Místo prostého opakování číslic do okna terminálu můžete zavolat jiný příkaz nebo skript. Tento příkaz nebo skript ani nepotřebuje používat číslice a jsou zde pouze k nastartování každého cyklu smyčky.

yes "$(seq 1 20)" | while read digit; do echo digit; sleep 1; done

Někdy je užitečné mít k testování velký soubor. Možná si chcete procvičit používání příkazu zip nebo chcete mít velký soubor k testování odesílání na FTP.

Pomocí yes můžete rychle generovat velké soubory. Vše, co musíte udělat, je dát mu dlouhý řetězec textu, se kterým bude pracovat, a přesměrovat výstup do souboru. Nechybuj; tyto soubory budou rychle růst. Buďte připraveni stisknout Ctrl+C během několika sekund.

yes long line of meaningless text for file padding > test.txt
ls -lh test.txt
wc test.txt

Zde vygenerovaný soubor zabral na testovacím stroji použitém k výzkumu tohoto článku asi pět sekund. ls hlásí, že má velikost 557 Mb a wc nám říká, že je v něm 12,4 milionů řádků.

Velikost souboru můžeme omezit zahrnutím hlavy do našeho příkazového řetězce. Řekneme mu, kolik řádků má soubor zahrnout. -50 znamená, že hlava propustí pouze 50 řádků do souboru test.txt.

yes long line of meaningless text for file padding | head -50 > test.txt

Jakmile je v souboru test.txt 50 řádků, proces se zastaví. Nemusíte používat Ctrl+C. Dochází k elegantnímu zastavení z vlastní vůle.

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 několik dalších triků), příkaz yes nebude součástí vaší každodenní sady příkazů. Ale když to budete potřebovat, zjistíte, že je to jednoduchost sama o sobě – a to vše v šesti řádcích zlatého kódu.