GNU/Linux >> Znalost Linux >  >> Linux

Jaké jsou ovládací a přesměrovací operátoři Shell?

Č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 ; command2
    

    První command1 spustí se v popředí a po dokončení se spustí command2 bude 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 & command2
    

    Zde command1 se spouští na pozadí a command2 spustí se v popředí okamžitě, bez čekání na command1 pro ukončení.

    Nový řádek za command1 je 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 && command2
    

    Zde command2 spustí se po command1 skončilo a pouze if command1 byl ú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
    fi
    

    nebo jednoduše if command1; then command2; fi pokud 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 || command2
    

    Zde command2 spustí se pouze v případě, že command1 selhalo (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
    fi
    

    nebo 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 pro test utility.

    ! 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 | command2
    

    Jakýkoli výstup vytištěný command1 je předán jako vstup do command2 .

  • |& :Toto je zkratka pro 2>&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.

Související:Seznam souborů, ke kterým má program přístup?

( 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.txt
    

    Výše uvedené spustí command na obsah file.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.txt
    

    Pokud 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.txt
    

    Výše uvedené uloží výstup command jako out.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.txt
    

    Ve výše uvedeném příkladu > přesměruje standardní výstup a 2> přesměruje standardní chybu. Výstup lze také přesměrovat pomocí 1> ale protože se jedná o výchozí hodnotu, 1 se obvykle vynechává a zapisuje se jednoduše jako > .

    Takže ke spuštění command na file.txt a jeho výstup uložte do out.txt a všechny chybové zprávy v error.txt běž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í (s set -C nebo set -o noclobber ).

    command >| out.txt
    

    Pokud out.txt existuje, výstup command nahradí 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.txt
    

    Pokud out.txt existuje, výstup command bude 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.txt
    

    Standardní chyba i standardní výstup command budou uloženy v out.txt , přepsáním jeho obsahu nebo vytvořením, pokud neexistuje.

    command &>> out.txt
    

    Jako výše, kromě toho, že pokud out.txt existuje, výstup a chyba command bude k němu připojeno.

    &> varianta pochází z bash , 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 portable sh skripty.

  • << :Dokument zde. Často se používá k tisku víceřádkových řetězců.

     command << WORD
         Text
     WORD
    

    Zde command bude brát vše, dokud nenajde další výskyt WORD , Text ve výše uvedeném příkladu jako vstup . Zatímco WORD je často EoF nebo jejich variací, může to být libovolný alfanumerický (nejen) řetězec, který se vám líbí. Když WORD je 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 ... WORD př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 <<< WORD
    

    Cokoli je uvedeno jako WORD je expandován a jeho hodnota je předána jako vstup do command . 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).

Související:Jak odložit variabilní expanzi?

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.


Linux
  1. Jaké jsou výhody CloudLinuxu?

  2. Co je vdso a vsyscall?

  3. Jaké jsou (ne)výhody ext4, ReiserFS, JFS a XFS?

  1. Co je/jsou standardní programy CLI pro správu uživatelů a skupin?

  2. Jaké jsou rozdíly mezi rdesktop a xfreerdp?

  3. Jaký je příkaz k určení, zda jsou OpenSSL a mod_ssl nainstalovány na apache2?

  1. Jaké jsou hlavní rozdíly mezi Bsd a Gnu/linux Userland?

  2. Io Redirection and the Head Command?

  3. Jaké jsou funkční rozdíly mezi .profile .bash_profile a .bashrc