Každý proces v Linuxu je vybaven třemi otevřenými soubory (obvykle nazývanými deskriptor souborů). Tyto soubory jsou standardními vstupními, výstupními a chybovými soubory. Ve výchozím nastavení:
- Standardní vstup je klávesnice abstrahovaná jako soubor, aby bylo snazší psát skripty shellu.
- Standardní výstup je okno shellu nebo terminál, ze kterého se skript spouští, abstrahovaný jako soubor, aby se opět usnadnilo psaní skriptů a programů
- Standardní chyba je stejný jako standardní výstup:okno shellu nebo terminál, ze kterého se skript spouští.
Deskriptor souboru je jednoduše číslo, které odkazuje na otevřený soubor. Ve výchozím nastavení je deskriptor souboru 0 (nula) odkazuje na standardní vstup a často se zkracuje jako stdin . Deskriptor souboru 1 odkazuje na standardní výstup (stdout ) a deskriptor souboru 2 odkazuje na standardní chybu (stderr ). Tato čísla jsou důležitá, když potřebujete získat přístup k určitému souboru, zvláště když chcete tyto soubory přesměrovat do jiných umístění, čísla deskriptorů souborů stoupají od nuly.
Přesměrování standardního výstupu
Syntaxe pro přesměrování výstupu příkazu do souboru.
# Command_options_and_arguments> výstupní_soubor
Příklad :
[e-mail chráněný]:~$ cat /proc/cpuinfo> command.txt
Můžeme vidět data, která by se dostala na obrazovku pomocí příkazu more:
[Chráněný emailem]:~ $ více Command.txt Procesor:0Vendor_id:OrenuIntelcpu Family:6model:37model Jméno:Intel (R) Core (TM) I3 CPU M 370 @ 2,40GHzstepping:5Microcode:0x616CPU MHz:0x616CPU MHz:0.000Cache Velikost :6144 kB fyzické id :0sourozenci :2jádrové id :0jádrů procesoru :2apicid :0počáteční apicid :0fpu : 5 výjimka:p ano výjimka: výjimkaOperátor> říká shellu, aby přesměroval výstup příkazu do daného souboru. Pokud soubor existuje, smaže starý obsah souboru a nahradí jej výstupem příkazu.
Přesměrování vstupu příkazu
Syntaxe pro přesměrování vstupu příkazu tak, aby pocházel ze souboru.
# Command_options_and_arguments
Pomocí operátoru
[e-mail chráněný]:~$ wc -l <command.txt52V tomto příkladu je vstup do „wc ‘ příkaz pochází ze souboru s názvem command.txt. Shell odešle obsah souboru command.txt jako standardní vstup pro příkaz wc.
Poznámka: Můžeme také kombinovat obě přesměrování s následující syntaxí :
# command_options_and_agruments
výstupní_soubor. Standardní chyba přesměrování
Kromě přesměrování standardního vstupu a výstupu pro skript nebo příkaz můžeme také přesměrovat standardní chybu. I když standardní chyba ve výchozím nastavení jde na stejné místo jako standardní výstup – okno shellu nebo terminál. Existují dobré důvody, proč jsou stdout a stderr zpracovány odděleně. Hlavním důvodem je, že můžeme přesměrovat výstup příkazu nebo příkazů do souboru, ale nemáte možnost zjistit, zda došlo k chybě. Oddělení stderr od stdout umožňuje, aby se na obrazovce objevila chybová zpráva, zatímco výstup stále jde do souboru.
Syntaxe pro přesměrování stderr z příkazu do souboru.
# command_options_and_agruments 2> výstupní_soubor.
2 v 2> odkazuje na deskriptor souboru 2, číslo deskriptoru pro stderr.
Příklad:
[e-mail protected]:~$ lsash /usr/bin 2> commands-error.txt[email protected]:~$ cat commands-error.txt Nebyl nalezen žádný příkaz 'lsash', měli jste na mysli:Příkaz 'sash' z balíček 'sash' (universe)lsash:příkaz nenalezenPřesměrování standardního výstupu i standardní chyby
Použijte 2>&1 Syntaxe pro přesměrování standardní chyby do stejného umístění jako standardní výstup .
Příklad:1
[e-mail chráněný]:~$ ls /usr/bin> command.txt 2>&1Nad příkazem jsou tři části.
- ls /usr/bin je spuštění příkazu
- > command.txt přesměruje výstup příkazu ls
- 2>&1 odešle výstup deskriptoru souboru 2, stderr , do stejného umístění jako deskriptor souboru 1, stdout.
Příklad:2
[e-mail chráněný]:~$ ls /usr2222/bin> command.txt 2>&1[e-mail chráněný]:~$ další command.txtls:nelze získat přístup k /usr2222/bin:Žádný takový soubor nebo adresářVšimněte si, že výše uvedený příklad předpokládá, že váš systém nemá názvy adresářů „/usr2222/bin“
Přesměrování stderr i stdout najednou
[e-mail chráněný]:~$ ls /usr2222/bin &> command.txt[email protected]:~$ more command.txtls:nelze získat přístup k /usr2222/bin:Žádný takový soubor nebo adresářVe výše uvedeném příkazu je ls příkaz , /usr2222/bin je argument pro „ls příkaz ‘ a ‘&> command.txt ‘ přesměrovat stdout i stderr do souboru s názvem command.txt.
Připojování k souborům
Pomocí operátoru „>>“ přesměrujte výstup příkazu, ale připojte jej k souboru, pokud existuje. Syntaxe je uvedena níže:
# Příkaz>> file_to_append.
Příklad:
[chráněno e-mailem]:~$ doba provozu>> sysload.txt[chráněno e-mailem]:~$ doba provozu>> sysload.txt[chráněno e-mailem]:~$ doba provozu>> sysload.txt[chráněno e-mailem]:~$ více sysload.txt11:49:17 až 1:22, 3 uživatelé, průměr zatížení:0,28, 0,12, 0,1111:49:28 až 1:22, 3 uživatelé, průměr zatížení:0,40, 0,15, 0,1211:49:36 až 1:23, 3 uživatelé, průměrná zátěž:0,33, 0,14, 0,12Zkrácení souborů:
Pro zkrácení souborů můžeme použít zkrácenou syntaxi vynecháním příkazu před> operátorem . Syntaxe je uvedena níže:
#> název_souboru
Můžeme také použít alternativní formát s dvojtečkou :
# :> název_souboru
Oba tyto příkazy bez příkazů vytvoří soubor, pokud neexistuje, a zkrátí soubor na nula bajtů, pokud soubor existuje.
[e-mail chráněný]:~$ ls /usr/bin> command.txt[e-mail chráněný]:~$ ls -l command.txt-rw-rw-r-- 1 linuxtechi linuxtechi 19713 2. prosince 12:18 příkaz .txt[e-mail chráněný]:~$> command.txt[e-mail chráněný]:~$ ls -l command.txt-rw-rw-r-- 1 linuxtechi linuxtechi 0. prosince 12:18 command.txtRychlé odesílání výstupu nikam
Existují některé scénáře, kdy nejen chcete přesměrovat výstup příkazu, ale chcete výstup zahodit. Můžete to udělat přesměrováním výstupu příkazu do nulového souboru „/dev/null“ Nulový soubor spotřebovává veškerý výstup, který se mu posílá, jako kdyby /dev/null byla hvězda černé díry.
[e-mail chráněný]:~$ ls /usr/bin> /dev/nullPoznámka:Soubor /dev/null se často nazývá bit bucket.
Doporučená četba :Jak používat šifrované heslo ve skriptu Linux Bash Shell
25 Otázky a odpovědi k rozhovoru se skriptováním Linux Shell Jak používat příkaz if else Conditionals ve skriptu BashLinux