Přesměrování vstupu a výstupu je přirozenou funkcí každého programovacího nebo skriptovacího jazyka. Technicky se to děje neodmyslitelně, kdykoli komunikujete s počítačem. Vstup se čte z stdin
(standardní vstup, obvykle klávesnice nebo myš), výstup jde do stdout
(standardní výstup, textový nebo datový tok) a chyby jsou odesílány na stderr
. Pochopení toho, že tyto datové toky existují, vám umožní řídit, kam jdou informace, když používáte shell, jako je Bash nebo Zsh.
Jako umístění souborového systému v Linuxu existují standardní vstup, standardní výstup a standardní chyba. Můžete je vidět v /dev
:
$ ls /dev/std*
/dev/stderr@ /dev/stdin@ /dev/stdout@
Přímo s nimi toho moc dělat nemůžete, ale někdy je užitečné je považovat za meta-místa, kam můžete posílat data.
Základy přesměrování jsou jednoduché:použijte určitý počet >
znaků pro přesměrování výstupu a určitý počet <
znaků pro přesměrování vstupu.
Přesměrování výstupu
Chcete-li zapsat výstup příkazu ls do souboru:
$ ls > list.txt
Nevidíte výstup ls
jako obvykle, protože výstup je zapsán do list.txt
soubor místo vaší obrazovky. To je ve skutečnosti tak univerzální, že jej můžete použít i ke kopírování obsahu jednoho souboru do druhého. Nemusí to být ani textový soubor. Pro binární data můžete použít přesměrování:
$ cat image.png > picture.png
(V případě, že by vás zajímalo, proč byste to někdy chtěli udělat, je to někdy užitečná odezva na oprávnění souborů.)
Přesměrování vstupu
Vstup můžete také přesměrovat "do" příkazu. To je pravděpodobně méně užitečné než přesměrování výstupu, protože mnoho příkazů je již pevně zakódováno tak, aby převzaly vstup z vámi poskytnutého argumentu. Může to být užitečné, když příkaz očekává seznam argumentů a vy máte tyto argumenty v souboru a chcete je rychle „zkopírovat a vložit“ ze souboru do vašeho terminálu (kromě toho, že ve skutečnosti nechcete kopírovat a vložit):
$ sudo dnf install $(<package.list)
Běžné použití přesměrování vstupu je dokument zde (nebo jen zde-doc zkráceně) a řetězec zde techniky. Tato metoda zadávání přesměruje blok textu do standardního vstupního proudu až na speciální značku konce souboru (většina lidí používá EOF
, ale může to být jakýkoli řetězec, u kterého očekáváte, že bude jedinečný). Zkuste to napsat (až do druhé instance EOF
) do terminálu:
$ echo << EOF
> foo
> bar
> baz
> EOF
Očekávaný výsledek:
foo
bar
baz
zde-doc je běžný trik používaný skriptery Bash k vysypání několika řádků textu do souboru nebo na obrazovku. Pokud nezapomenete ukončit klauzuli značkou konce souboru, je to účinný způsob, jak se vyhnout nepraktickým seznamům echo
nebo printf
prohlášení.
řetězec zde je podobný zde-doc , ale skládá se pouze z jednoho řetězce (nebo několika řetězců maskovaných jako jeden řetězec s uvozovkami):
$ cat <<< "foo bar baz"
foo bar baz
Chybové zprávy přesměrování
Chybové zprávy míří do streamu s názvem stderr
, označený jako 2>
pro účely přesměrování. Tento příkaz přesměruje chybové zprávy do souboru s názvem output.log
:
$ ls /nope 2> output.log
Odesílání dat do /dev/null
Více o Bash
- Bashův cheat
- Úvod do programování pomocí Bash
- Průvodce systémového administrátora skriptováním v Bash
- Nejnovější články o Bash
Stejně jako existují umístění pro standardní vstup, standardní výstup a chybu, existuje také umístění pro nikde na souborovém systému Linux. Jmenuje se null
a nachází se v /dev
, takže je často vyslovováno "devnull" lidmi, kteří jej používají příliš často, než aby řekli "lomítko dev lomítko null."
Data můžete odeslat na /dev/null
pomocí přesměrování. Například find
příkaz bývá podrobný a často hlásí konflikty oprávnění při prohledávání vašich souborů:
$ find ~ -type f
/home/seth/actual.file
find: `/home/seth/foggy': Permission denied
find: `/home/seth/groggy': Permission denied
find: `/home/seth/soggy': Permission denied
/home/seth/zzz.file
find
příkaz to zpracuje jako chybu, takže můžete přesměrovat pouze chybové zprávy na /dev/null
:
$ find ~ -type f 2> /dev/null
/home/seth/actual.file
/home/seth/zzz.file
Použití přesměrování
Přesměrování je efektivní způsob, jak získat data z jednoho místa na druhé v Bash. Přesměrování možná nepoužíváte pořád, ale když se ho naučíte používat, když ho potřebujete, můžete si ušetřit spoustu zbytečného otevírání souborů a kopírování a vkládání dat, což vše obecně vyžaduje pohyb myši a hodně stisknutí kláves. Neuchylujte se k takovým extrémům. Žijte dobrý život a používejte přesměrování.