Přesměrování vstupu a výstupu v příkladech Linux/Unix

⚡ Chytré shrnutí

Přesměrování v Linuxu a Unixu mění, kde příkaz čte vstup nebo odesílá výstup, swapping klávesnici a obrazovku pro soubory nebo zařízení pomocí operátorů, jako je znaménko „větší než“, znaménko „menší než“ a operátor připojení.

  • 🔀 přesměrování: Přesměrování změní standardní vstup nebo výstup příkazu z klávesnice a obrazovky do souboru nebo zařízení.
  • ➡️ Výstup: Operátor > zapisuje výstup do souboru, zatímco >> připojuje výstup k existujícímu souboru bez jeho smazání.
  • ⬅️ Vstup: Operátor < vkládá soubor do příkazu jako standardní vstup místo klávesnice.
  • 🔢 Deskriptory souborů: Každý otevřený soubor dostane číslo: 0 pro stdin, 1 pro stdout a 2 pro stderr.
  • ⚠️ Přesměrování chyby: Použití 2> odesílá chybové zprávy do samostatného souboru, aby nezahlcovaly normální výstup.
  • 🔗 Kombinované proudy: Syntaxe 2>&1 směruje standardní chybovou zprávu na stejný cíl jako standardní výstup.
  • 🤖 Pomoc s umělou inteligencí: Asistenti s umělou inteligencí a GitHub Copilot dokáží vytvářet a vysvětlovat příkazy pro přesměrování a skripty shellu.

Přesměrování vstupu a výstupu v Linuxu a Unixu s příklady

Přesměrování je jednou z nejužitečnějších funkcí Linux a Unixový shell, protože vám umožňuje rozhodnout se, kam příkaz čte svůj vstup a odesílá svůj výstup. Tato stránka vysvětluje výstup, vstup a přesměrování chyb s pomocí praktických příkladů.

Co je přesměrování?

Přesměrování je funkce v Linuxu, která umožňuje při provádění příkazu změnit standardní vstupní a výstupní zařízení. Základní pracovní postup jakéhokoli Linuxový příkaz je to, že přijímá vstup a dává výstup.

  • Standardním vstupním (stdin) zařízením je klávesnice.
  • Standardním výstupním (stdout) zařízením je obrazovka.

Pomocí přesměrování lze změnit výše uvedený standardní vstup a výstup.

Přesměrování výstupu

Níže uvedený obrázek označuje začátek příkladů přesměrování výstupu.

Obrázek záhlaví sekce přesměrování výstupu

Symbol '>' se používá pro přesměrování výstupu (STDOUT).

Příklad:

ls -al > listings

Zde je výstup příkazu ls -al přesměrován do souboru „listings“ místo na vaši obrazovku. Výsledek ukazuje snímek obrazovky níže.

Terminál zobrazující výpis s příkazem ls -al přesměrovaný do souboru s výpisy

Poznámka: Při přesměrování výstupu příkazu do souboru použijte správný název souboru. Pokud soubor se stejným názvem již existuje, přesměrovaný příkaz jeho obsah smaže a poté jej přepíše.

Pokud nechcete, aby byl soubor přepsán, ale chcete do existujícího souboru přidat další obsah, použijte operátor '>>'. Níže uvedený snímek obrazovky ukazuje obsah doplněný znakem '>>'.

Terminál zobrazující výstup příkazu připojený k existujícímu souboru pomocí operátoru double greater-than

Standardní výstup můžete přesměrovat nejen do souborů, ale také do zařízení.

$ cat music.mp3 > /dev/audio

Příkaz cat přečte soubor music.mp3 a odešle výstup do /dev/audio, což je zvukové zařízení. Pokud je konfigurace zvuku na vašem počítači správná, tento příkaz přehraje hudební soubor.mp3.

Přesměrování vstupu

Níže uvedený obrázek představuje přesměrování vstupu.

Obrázek záhlaví sekce přesměrování vstupu

Symbol '<' se používá pro přesměrování vstupu (STDIN).

Příklad: Poštovní program v Linuxu vám může pomoci s odesíláním e-mailů z terminálu.

Obsah e-mailu můžete zadat pomocí klávesnice, standardního vstupního zařízení. Pokud ale chcete k e-mailu připojit soubor, můžete použít operátor přesměrování vstupu v následujícím formátu.

mail -s "Subject" to-address < Filename

Níže uvedený snímek obrazovky ukazuje příkaz mail, který čte soubor jako svůj vstup.

příkaz mail s přesměrováním vstupu pro připojení souboru k e-mailu

Tím se soubor připojí k e-mailu a ten se odešle příjemci.

Výše uvedené příklady byly jednoduché. Nyní se podívejme na některé pokročilé techniky přesměrování, které využívají deskriptory souborů.

Soubor Descriptors (FD)

V Linuxu a Unixu je všechno soubor. Běžné soubory, adresáře a dokonce i zařízení jsou soubory. Každý soubor má přiřazené číslo nazývané souborový deskriptor (FD).

Níže uvedený diagram ukazuje standardní streamy a jejich deskriptory souborů.

Schéma standardních vstupních, výstupních a chybových proudů a jejich souborových deskriptorů

Vaše obrazovka má také deskriptor souboru. Když je program spuštěn, výstup se odešle do deskriptoru souboru obrazovky a výstup programu se zobrazí na monitoru. Pokud by byl výstup odeslán do deskriptoru souboru tiskárny, výstup programu by se vytiskl.

Chyba přesměrování

Kdykoli spustíte program nebo příkaz v terminálu, jsou vždy otevřeny tři soubory, a to standardní vstup, standardní výstup a standardní chybový soubor.

Tyto soubory jsou vždy přítomny při spuštění programu. Jak již bylo vysvětleno, ke každému z těchto souborů je přiřazen souborový deskriptor.

Soubor Soubor Descriptor
Standardní vstup STDIN 0
Standardní výstup STDOUT 1
Standardní chyba STDERR 2

Ve výchozím nastavení se na obrazovce zobrazuje proud chyb. Přesměrování chyb směruje chyby do souboru jiného než na obrazovku.

Proč došlo k chybě přesměrování?

Přesměrování chyb je jednou z velmi oblíbených funkcí Unixu a Linuxu.

Častí uživatelé Unixu vědí, že mnoho příkazů způsobuje obrovské množství chyb. Například při vyhledávání souborů se obvykle objeví povolení odepřené chyby, které obvykle nepomáhají osobě hledající konkrétní soubor. Při spouštění skriptů shellu často nechcete, aby chybové zprávy zahlcovaly normální výstup programu.

Řešením je přesměrovat chybové zprávy do souboru.

Příklad 1

$ myprogram 2>errorsfile

Níže uvedený snímek obrazovky ukazuje tento příkaz v terminálu.

Terminál spuštěný s myprogramem a standardní chybou přesměrovanou na soubor errorsfile

Výše uvedený příklad spouštíme program s názvem můjprogram. Deskriptor souboru pro standardní chybu je 2. Pomocí „2>“ přesměrujeme výstup chyby do souboru s názvem „errorsfile“. Výstup programu tak není zahlcen chybami.

Příklad 2

Zde je další příklad, který používá příkaz find.

find . -name 'my*' 2>error.log

Pomocí příkazu find hledáme v aktuálním adresáři „.“ soubor, jehož název začíná na „my“, a všechny chyby odesíláme do souboru error.log.

Příklad 3: Podívejme se na složitější příklad.

Správci serveru často vypisují adresáře a ukládají chybový i standardní výstup do souboru, který lze později zpracovat. Zde je příkaz.

ls Documents ABC> dirlist 2>&1

Níže uvedený diagram ukazuje zachycení obou streamů do jednoho souboru.

Schéma standardního výstupu a standardní chyby, oba přesměrované do adresáře souborů

Zde:

  • 2>&1 znamená, že STDERR je přesměrován na stejný cíl jako STDOUT (což je seznam adresářů souborů).
  • Výstup chyby je přesměrován na standardní výstup, který je následně přesměrován do adresáře souboru. Oba streamy jsou tedy zapisovány do adresáře souboru.

Níže uvedený diagram shrnuje, jak do sebe vstup, výstup a přesměrování chyb zapadají.

Diagram shrnující vstup, výstup a přesměrování chyb v Linuxu a Unixu

Nejčastější dotazy

A dýmkou (|) odesílá výstup jednoho příkazu přímo do jiného příkazu jako jeho vstup. Přesměrování místo toho propojuje příkaz se souborem nebo zařízením, zapisuje do něj výstup nebo z něj čte vstup. Propojení příkazů pomocí rour; přesměrování spojuje příkaz se souborem.

Operátor > zapíše výstup příkazu do souboru a nahradí veškerý existující obsah. Operátor >> připojí výstup na konec souboru, keeping co už tam je. Použijte >>, kdykoli chcete do souboru něco přidat, místo abyste ho přepsali.

/dev/null je speciální soubor, který zahazuje vše, co je do něj zapsáno. Přidáním 2>/dev/null k příkazu se jeho chybové zprávy přesměrují do tohoto souboru a tiše se zahodí, takže se na obrazovce zobrazí pouze normální výstup. Je to běžný způsob, jak skrýt nežádoucí zmatek chyb.

Příkaz tee čte ze standardního vstupu a zapisuje data na obrazovku i do jednoho nebo více souborů najednou, například ls -al | tee listing.txt. Umožňuje uložit výstup příkazu do souboru a zároveň jej zobrazit na obrazovce.

Dokument typu here používá operátor << k vložení několika řádků vloženého textu do příkazu jako vstupu, končícího na vámi zvoleném slově. To je užitečné v shellových skriptech pro předávání víceřádkového vstupu, například těla e-mailu, bez samostatného souboru.

Po přesměrování výstupu použijte syntaxi 2>&1, například v příkazu > soubor 2>&1, takže standardní chybový kód bude následovat standardní výstup do souboru. V moderním Bashu totéž dělá zkrácený příkaz &> soubor. Pořadí je důležité: umístěte 2>&1 za přesměrování výstupu.

Asistenti s umělou inteligencí dokáží převést požadavek v jednoduché angličtině na správný příkaz pro přesměrování, vysvětlit, co dělají operátory jako 2>&1 nebo &>, a označit chyby před jejich spuštěním. Nástroje strojového učení také prohledávají přesměrované protokoly a chybové soubory, aby odhalily anomálie, které by ruční kontrola přehlédla.

Ano. GitHub Copilot dokáže generovat příkazy a skripty, které přesměrují vstup, výstup a chyby z krátkého komentáře popisujícího cíl a dokončí je během psaní. RevProhlédněte si všechny navrhované příkazy pro vaše soubory, zejména ty, které používají > a přepisují existující data.

Shrňte tento příspěvek takto: