Jako správce Linuxu existuje mnoho příležitostí, kdy musíte uložit výstup příkazu do souboru, kromě pouhého tisku výstupu na terminálu. Nevíte jak? Nechte unixový příkaz tee udělat trik.
V tomto tutoriálu se naučíte mnoho způsobů, jak používat tee
příkaz k uložení a připojení výstupu k souboru.
Připraveni? Čtěte dál a posuňte skriptování shellu na další úroveň!
Předpoklady
Tento tutoriál bude praktickou ukázkou. Pokud chcete pokračovat, ujistěte se, že máte systém Linux. Tento tutoriál používá Ubuntu 20.04, ale můžete použít jakoukoli variantu Linuxu.
Přesměrování výstupů příkazů (STDOUT/STDERR)
Před spuštěním tee
je důležité pochopit, jak přesměrování funguje. V Linuxu je vše považováno za soubor, včetně zařízení, adresářů a dokonce i výstupu příkazů. Výsledkem je, že můžete vzít výstup jednoho příkazu a použít tento výstup jako vstup pro jiný příkaz (přesměrování souborů).
Existují různé typy přesměrování a každé slouží svému účelu. Ale při spuštění tee
příkaz, primárně používáte dva různé typy přesměrování:
- Standardní přesměrování výstupu (STDOUT) (>) – výchozí výstup příkazu.
- Standard Error Redirect (STDERR)(2>) – Chybová zpráva generovaná příkazem a zobrazená na obrazovce.
Obě přesměrování berou a ukládají výstupy příkazů do souboru, ale níže uvidíte, jak přesměrování fungují.
Spusťte ls
příkaz bez argumentů vypíše veškerý obsah (soubory a složky) vašeho pracovního adresáře.
ls
Níže je uveden STDOUT příkazu ls.
Dále spusťte níže uvedený příkaz a záměrně vypište obsah adresáře (fake_directory
), který neexistuje.
ls fake_directory
Zobrazí se chybová zpráva, že adresář neexistuje. Tento výstup je STDERR příkazu ls.
Ukládání výstupů příkazů do souboru
Předpokládejme, že chcete uložit STDOUT z ls
příkaz do souboru místo pouhého tisku výstupu na terminál. V tomto případě operátor přesměrování (>
) přijde vhod.
1. Spusťte následující příkaz pro uložení/přesměrování (>) STDOUT příkazu ls do souboru s názvem ls_stdout.txt. Protože tento příkaz uloží výstup do souboru, nedostanete výstup na svůj terminál.
ls > ls_stdout.txt
2. Nyní spusťte níže uvedený příkaz cat pro zobrazení obsahu vašeho souboru ls_stdout.txt.
cat ls_stdout.txt
3. Podobně spusťte následující příkaz pro uložení STDERR (2>) příkazu ls do souboru s názvem ls_stderr.txt. Opět nezískáte výstup na vašem terminálu, protože výstup je uložen do souboru.
ls fake_directory 2> ls_stderr.txt
4. Nyní spusťte níže uvedený příkaz cat, abyste viděli obsah souboru ls_stderr.txt.
cat ls_stderr.txt
Níže můžete potvrdit, že STDERR příkazu ls byl uložen do ls_stderr.txt soubor.
5. Spusťte níže uvedený příkaz a uložte (&>) STDOUT i STDERR příkazu ls do souboru s názvem ls_alloutput.txt.
Proč se spokojit s jedním, když můžete mít oba, že? Obvykle budete chtít uložit oba výstupy do stejného souboru pro účely odstraňování problémů nebo protokolování.
ls &> ls_alloutput.txt
6. Nakonec spusťte následující příkaz cat a zobrazte obsah souboru ls_alloutput.txt
cat ls_alloutput.txt
Připojování programů pomocí potrubí
Kromě pouhého ukládání výstupů do souboru můžete mnohem více dosáhnout pomocí potrubí, jako je propojování programů. Ve scénářích reálného světa budete s největší pravděpodobností používat kanály ve spojení s přesměrováním souborů a tee
příkaz.
Trubka (|
) je mechanismus pro meziprocesovou komunikaci, který vám umožňuje propojit výstup jednoho příkazu se vstupem jiného příkazu. Jinými slovy, roura přebírá STDOUT jednoho procesu a propojuje tento STDOUT se STDIN jiného procesu.
Spusťte následující příkaz grep a vyhledejte všechny řádky obsahující slovo tcp v souboru /etc/services.
grep tcp /etc/services
Nyní spusťte stejný grep
příkaz níže. Tentokrát však použijte výstup výše uvedeného grep
příkaz na less
příkaz pro zobrazení výsledků hledání po jedné obrazovce.
grep tcp /etc/services | less
Jak funguje potrubí? Jak můžete vidět níže, když použijete svislý znak (|), výstup grep
příkaz je uložen na dočasném místě. Výstup je pak předán jako vstup do less
příkaz.
Kombinace Unixového trička (tee
) Příkazy, kanály a přesměrování
Zatím jste se naučili, jak tee
fungují příkazy, roury a přesměrování. Proč ale nepoužít všechny tři dohromady pro lepší ovládání výstupů příkazů?
Dříve jste používali potrubí s přesměrováním, a to je obrovský krok. Tentokrát použijete potrubí a tee
příkaz k odeslání výstupu jednoho příkazu druhému k dalšímu zpracování.
Spuštěním níže uvedeného příkazu odešlete výstup ls
příkaz na obrazovku a result.txt
soubor. Výstup ls
je dále přesměrován do grep
k filtrování pouze řádků, které obsahují slovo ip
.
ls | grep 'ip' | tee result.txt
Nyní spusťte cat
příkaz k ověření obsahu výsledku .txt.
cat result.txt
Připojování výstupu k existujícím souborům
Dříve jste uložili výstup příkazů do souboru, ale můžete aktualizovat existující soubor namísto vytvoření nového? Ano! Nechte tee
příkaz udělej kouzla.
Ve výchozím nastavení tee
příkaz přepíše obsah existujícího souboru. Ale v mnoha případech můžete chtít připojit výstup příkazu k existujícímu souboru. Například protokolování všech událostí serveru v reálném čase do souboru protokolu.
Díky této funkci se k souboru protokolu připojí nové záznamy, kdykoli na serveru dojde k události.
Spuštěním níže uvedeného příkazu převezmete výstup příkazu ls -lR a připojte výstup (tee -a) k souboru result.txt obsah souboru. Tento příkaz neposkytuje výstup, protože výstup příkazu posíláte do souboru.
ls -lR | tee -a result.txt
Nyní spusťte cat
příkaz k ověření obsahu result.txt
soubor.
cat result.txt
Jak můžete vidět níže, výstup ls -lR
příkaz je připojen na konec souboru result.txt soubor.
Pomocí tee
Příkaz ve spojení s sudo
Mnoho příkazů vyžaduje zvýšená oprávnění nebo sudo
přístup, jako je provádění úprav v /etc adresář. Otázkou je, zda tee
příkaz pracovat ruku v ruce s sudo
? Ano!
Přidání sudo před příkaz tee umožňuje uživateli bez oprávnění root zapisovat data do souboru, který může upravovat pouze uživatel root. Chcete například povolit uživatele ata k zápisu dat do /etc/ata.conf soubor. Zároveň však nechcete uživateli poskytnout ata oprávnění root.
1. Přihlaste se ke svému počítači jako uživatel bez oprávnění root.
2. Dále spusťte následující příkaz bez sudo, abyste zapsali textová data do souboru /etc/ata.conf.
echo "data" > tee /etc/ata.conf
Jak můžete vidět níže, od ata se vám zobrazí chyba Povolení odepřeno uživatel nemá přístup pro zápis do /etc/ata.conf soubor.
3. Spusťte stejný příkaz jako v kroku 2 a zapište textová data do souboru /etc/ata.conf. Tentokrát však před příkaz tee přidejte příkaz sudo. Uživatel tak bude moci ata k dokončení příkazu (elevated) jako uživatel bez oprávnění root.
echo "data" | sudo tee /etc/ata.conf
Nakonec spusťte níže uvedený příkaz cat a ověřte, že ata uživatel mohl napsat text „data“ do /etc/ata.conf.
cat /etc/ata.conf
Závěr
V tomto tutoriálu jste se naučili, jak používat unixový příkaz tee k zápisu dat do souborů a jak funguje ve spojení s jinými příkazy. V tuto chvíli byste měli mít výkonnou kombinaci příkazů, které můžete použít ke správě vstupu a výstupu v prostředí příkazového řádku Linuxu.
Jste jako sushi šéfkuchař, který zcela kontroluje ingredience a proporce, které jsou součástí každého jídla. Každou objednávku můžete za chodu přizpůsobit tak, aby vyhovovala vkusu vašeho zákazníka. Jediným limitem je vaše představivost (a možná i velikost okna vašeho terminálu).
Nyní pokračujte a vytvořte úžasné směsice příkazového řádku!