Často vidím online návody, které spojují různé příkazy s různými symboly. Například:
command1 | command2
command1 & command2
command1 || command2
command1 && command2
Zdá se, že ostatní připojují příkazy k souborům:
command1 > file1
command1 >> file1
Co jsou tyto věci? jak se jim říká? Co dělají? Je jich víc?
Meta vlákno o této otázce..
Přijatá odpověď:
Říká se jim shellové operátory a ano, je jich více. Uvedu stručný přehled těch nejběžnějších mezi dvěma hlavními třídami, ovládacích operátorů a operátorů přesměrování, a jak fungují s ohledem na bash shell.
A. Ovládací operátory
Definice POSIX
V příkazovém jazyce shellu token, který vykonává řídicí funkci.
Je to jeden z následujících symbolů:& && ( ) ; ;; <newline> | ||
A |& v bash.
A ! není ovládací operátor, ale vyhrazené slovo. Stává se logickým NOT [operátor negace] uvnitř aritmetických výrazů a uvnitř testovacích konstrukcí (a přitom stále vyžaduje oddělovač mezery).
A.1 Seznam terminátorů
-
;:Spustí jeden příkaz po dokončení druhého, bez ohledu na výsledek prvního.command1 ; command2První
command1spustí se v popředí a po dokončení se spustícommand2bude spuštěn.Nový řádek, který není v řetězcovém literálu nebo za určitými klíčovými slovy, není ekvivalentní k operátoru středníku. Seznam
;jednoduché příkazy s oddělovači jsou stále seznam – stejně jako v analyzátoru shellu musí stále pokračovat ve čtení jednoduchých příkazů, které následují za;oddělující jednoduchý příkaz před provedením, zatímco nový řádek může oddělit celý seznam příkazů – nebo seznam seznamů. Rozdíl je nepatrný, ale komplikovaný:vzhledem k tomu, že shell nemá žádný předchozí imperativ pro čtení dat po novém řádku, nový řádek označuje bod, kde může shell začít vyhodnocovat jednoduché příkazy, které již načetl, zatímco;středník ne. -
&:Toto spustí příkaz na pozadí, což vám umožní pokračovat v práci ve stejném prostředí.command1 & command2Zde
command1se spouští na pozadí acommand2spustí se v popředí okamžitě, bez čekání nacommand1pro ukončení.Nový řádek za
command1je volitelné.
A.2 Logické operátory
-
&&:Používá se k vytváření seznamů AND a umožňuje vám spustit jeden příkaz, pouze pokud jiný úspěšně skončil.command1 && command2Zde
command2spustí se pocommand1skončilo a pouze ifcommand1byl úspěšný (pokud jeho výstupní kód byl 0). Oba příkazy se spouštějí na popředí.Tento příkaz lze také napsat
if command1 then command2 else false finebo jednoduše
if command1; then command2; fipokud je návratový stav ignorován. -
||:Používá se k vytváření seznamů NEBO a umožňuje vám spustit jeden příkaz pouze v případě, že jiný byl neúspěšně ukončen.command1 || command2Zde
command2spustí se pouze v případě, žecommand1selhalo (pokud vrátilo stav ukončení jiný než 0). Oba příkazy se spouštějí na popředí.Tento příkaz lze také napsat
if command1 then true else command2 finebo zkráceně
if ! command1; then command2; fi.Všimněte si, že
&&a||jsou levé asociativní; viz Priorita logických operátorů shellu &&, || pro více informací. -
!:Toto je vyhrazené slovo, které funguje jako operátor „ne“ (ale musí mít oddělovač), používá se k negaci návratového stavu příkazu – vrácení 0, pokud příkaz vrátí nenulový stav, vrátí 1, pokud vrátí stav 0 Také logické NE protestutility.! command1 [ ! a = a ]A skutečný operátor NOT uvnitř aritmetických výrazů:
$ echo $((!0)) $((!23)) 1 0
A.3 Operátor potrubí
-
|:Operátor roury, předává výstup jednoho příkazu jako vstup jinému. Příkaz vytvořený operátorem roury se nazývá potrubí.command1 | command2Jakýkoli výstup vytištěný
command1je předán jako vstup docommand2. -
|&:Toto je zkratka pro2>&1 |v bash a zsh. Předává standardní výstup i standardní chybu jednoho příkazu jako vstup jinému.command1 |& command2
A.4 Jiná interpunkční znaménka
;; se používá pouze k označení konce případu. Ksh, bash a zsh také podporují ;& pro přechod na další případ a ;;& (ne v ATT ksh), abyste mohli pokračovat a testovat následující případy.
( a ) se používají k seskupování příkazů a jejich spouštění v podshellu. { a } také seskupovat příkazy, ale nespouštět je v subshell. Podívejte se na tuto odpověď pro diskuzi o různých typech závorek, závorek a složených závorek v syntaxi shellu.
B. Operátoři přesměrování
POSIX definice operátora přesměrování
V příkazovém jazyce shellu token, který provádí funkci přesměrování. Je to jeden z následujících symbolů:
< > >| << >> <& >& <<- <>
Ty vám umožňují ovládat vstup a výstup vašich příkazů. Mohou se objevit kdekoli v rámci jednoduchého příkazu nebo mohou následovat po příkazu. Přesměrování jsou zpracovávána v pořadí, v jakém se objevují, zleva doprava.
-
<:Zadává příkazu.command < file.txtVýše uvedené spustí
commandna obsahfile.txt. -
<>:stejné jako výše, ale soubor je otevřen v režimu čtení+zápis režim namísto pouze pro čtení :command <> file.txtPokud soubor neexistuje, bude vytvořen.
Tento operátor se používá zřídka, protože příkazy obecně pouze čtou z jejich stdin, i když se to může hodit v řadě specifických situací.
-
>:Přesměruje výstup příkazu do souboru.command > out.txtVýše uvedené uloží výstup
commandjakoout.txt. Pokud soubor existuje, jeho obsah bude přepsán a pokud neexistuje, bude vytvořen.Tento operátor se také často používá k výběru, zda se má něco vytisknout na standardní chybový nebo standardní výstup:
command >out.txt 2>error.txtVe výše uvedeném příkladu
>přesměruje standardní výstup a2>přesměruje standardní chybu. Výstup lze také přesměrovat pomocí1>ale protože se jedná o výchozí hodnotu,1se obvykle vynechává a zapisuje se jednoduše jako>.Takže ke spuštění
commandnafile.txta jeho výstup uložte doout.txta všechny chybové zprávy verror.txtběželi byste:command < file.txt > out.txt 2> error.txt -
>|:Dělá totéž jako>, ale přepíše cíl, i když byl shell nakonfigurován tak, aby odmítl přepsání (sset -Cneboset -o noclobber).command >| out.txtPokud
out.txtexistuje, výstupcommandnahradí její obsah. Pokud neexistuje, bude vytvořen. -
>>:Dělá totéž jako>, kromě toho, že pokud cílový soubor existuje, připojí se nová data.command >> out.txtPokud
out.txtexistuje, výstupcommandbude k němu připojeno za cokoli, co v něm již je. Pokud neexistuje, bude vytvořen. -
>&:(podle specifikace POSIX), když je obklopen číslicemi (1>&2) nebo-na pravé straně (1>&-) buď přesměruje pouze jedno deskriptor souboru nebo jej zavře (>&-).A
>&následované číslem deskriptoru souboru je přenosný způsob přesměrování deskriptoru souboru a>&-je přenosný způsob, jak zavřít deskriptor souboru.Pokud je pravá strana tohoto přesměrování soubor, přečtěte si prosím následující položku.
-
>&,&>,>>&a&>>:(přečtěte si také výše) Přesměrujte standardní chybový i standardní výstup, nahrazujte nebo připojujte.command &> out.txtStandardní chyba i standardní výstup
commandbudou uloženy vout.txt, přepsáním jeho obsahu nebo vytvořením, pokud neexistuje.command &>> out.txtJako výše, kromě toho, že pokud
out.txtexistuje, výstup a chybacommandbude k němu připojeno.&>varianta pochází zbash, zatímco>&varianta pochází z csh (o desetiletí dříve). Oba jsou v konfliktu s ostatními operátory shellu POSIX a neměly by se používat v portableshskripty. -
<<:Dokument zde. Často se používá k tisku víceřádkových řetězců.command << WORD Text WORDZde
commandbude brát vše, dokud nenajde další výskytWORD,Textve výše uvedeném příkladu jako vstup . ZatímcoWORDje častoEoFnebo jejich variací, může to být libovolný alfanumerický (nejen) řetězec, který se vám líbí. KdyžWORDje citován, text v tomto dokumentu je zpracován doslovně a nejsou prováděny žádné expanze (například u proměnných). Pokud není v uvozovkách, proměnné se rozšíří. Další podrobnosti naleznete v příručce bash.Pokud chcete výstup
command << WORD ... WORDpřevést do potrubí přímo do jiného příkazu nebo příkazů, musíte umístit potrubí na stejný řádek jako<< WORD, nemůžete jej umístit za ukončovací slovo WORD nebo na řádek následující. Například:command << WORD | command2 | command3... Text WORD -
<<:Zde řetězce, podobné jako zde dokumenty, ale určené pro jeden řádek. Ty existují pouze v unixovém portu nebo rc (kde pochází), zsh, některých implementacích ksh, yash a bash.command <<< WORDCokoli je uvedeno jako
WORDje expandován a jeho hodnota je předána jako vstup docommand. To se často používá k předání obsahu proměnných jako vstupu do příkazu. Například:$ foo="bar" $ sed 's/a/A/' <<< "$foo" bAr # as a short-cut for the standard: $ printf '%sn' "$foo" | sed 's/a/A/' bAr # or sed 's/a/A/' << EOF $foo EOF
Několik dalších operátorů (>&- , x>&y x<&y ) lze použít k uzavření nebo duplikování deskriptorů souborů. Podrobnosti o nich najdete v příslušné části manuálu vašeho shellu (zde například pro bash).
To pokrývá pouze nejběžnější operátory shellů podobných Bourneovi. Některé shelly mají několik dalších vlastních operátorů přesměrování.
Ksh, bash a zsh mají také konstrukty <(…) , >(…) a =(…) (ten druhý v zsh pouze). Nejedná se o přesměrování, ale o substituci procesu.