Popel - příkaz Linux - příkaz Unix

NÁZEV

sh - příkazový interpret ( shell )

SYNOPSE

sh [- / + aCefnuvxIimqsVEbc ] [- o jméno ] -words [ cíl ... ]

POPIS

Sh je standardní příkazový interpret pro systém. Aktuální verze sh je v procesu změny, aby odpovídala specifikacím POSIX 1003.2 a 1003.2a pro shell. Tato verze má mnoho vlastností, které z ní v některých ohledech vypadají podobně jako shell Korn, ale není klonem Korn shell (viz ksh (1)). Pouze funkce označené POSIX plus několik rozšíření Berkeley jsou začleněny do tohoto shellu. Očekáváme, že POSIX bude v souladu s podmínkou vydání 4.4 BSD. Tato manuálová stránka není určena k výuce nebo k úplné specifikaci shellu.

Přehled

Shell je příkaz, který čte řádky ze souboru nebo terminálu, interpretuje je a obecně provádí další příkazy. Jedná se o program, který běží při přihlášení uživatele do systému (i když uživatel může zvolit jiný shell pomocí příkazu chsh (1)). Shell implementuje jazyk, který má konstrukce řízení toku, makro zařízení, které nabízí kromě ukládání dat celou řadu vlastností spolu s vestavěnými funkcemi pro úpravu historie a linek. Obsahuje mnoho funkcí, které napomáhají interaktivnímu použití a má tu výhodu, že interpretační jazyk je společný interaktivnímu i neinteraktivnímu použití (shell skripty). To znamená, že příkazy mohou být zadány přímo do běžícího shellu nebo mohou být vloženy do souboru a soubor může být spuštěn přímo pomocí shellu.

Vyvolání

Pokud nejsou přítomny žádné argumenty a pokud je standardní vstup shellu připojen k terminálu (nebo pokud je nastaven příznak - i ) a volba - c není přítomna, shell se považuje za interaktivní shell . Interaktivní shell obecně vyzve před každým příkazem a zpracovává chyby programování a příkazu jinak (jak je popsáno níže). Při prvním spuštění shell kontroluje argument 0 a pokud začíná pomlčkou `- ', shell je také považován za přihlašovací shell. To se obvykle provádí automaticky systémem při prvním přihlášení uživatele. Přihlašovací shell nejprve přečte příkazy ze souborů / etc / profile a .profile, pokud existují. Pokud je proměnná prostředí ENV nastavena na vstup do shellu, nebo je nastavena v .profile přihlašovacího shellu, pak shell načte příkazy ze souboru pojmenovaného v ENV. Proto by měl uživatel umístit příkazy, které mají být provedeny pouze na přihlašovací čas v souboru .profile a příkazy, které jsou provedeny pro každý shell uvnitř souboru ENV . Chcete-li nastavit proměnnou ENV na nějaký soubor, umístěte následující řádek do svého profilu

ENV = $ HOME / .shinit; export ENV

nahrazující `` .shinit '' libovolný název souboru, který chcete. Vzhledem k tomu, že soubor ENV je čten pro každé vyvolání shellu, včetně shell skriptů a neinterakčních skořepin, je následující paradigma užitečná pro omezení příkazů v souboru ENV na interaktivní vyvolání. Umístěte příkazy do `` case '' a ` esac '' níže (tyto příkazy budou popsány později):

případ $ - v * i *)

# příkazy pouze pro interaktivní použití

...

esac

Pokud byly zadány parametry příkazové řádky kromě voleb, pak shell zachází s prvním argumentem jako s názvem souboru, z něhož mají číst příkazy (shellový skript) a zbývající argumenty jsou nastaveny jako polohové parametry shellu ($ 1 , $ 2, atd.). V opačném případě shell sleduje příkazy z jeho standardního vstupu.

Zpracování seznamu argumentů

Všechny volby pro jednotlivé písmena mají odpovídající název, který lze použít jako argument pro volbu - o . Název nastaveného parametru je uveden vedle možnosti písmen v následujícím popisu. Zadání pomlčky `` - '' zapne volbu, při použití funkce plus `` '' tuto volbu deaktivuje. Následující volby lze nastavit z příkazového řádku nebo pomocí vestavěné sady (1) (popsané později).

- allexport

Exportovat všechny proměnné přiřazené. (NEIMPLEMENTED pro 4,4 alpha)

-C

Číst příkazy z příkazového řádku. Z standardního vstupu nebudou číst žádné příkazy.

-Cloblobber

Nepřepínejte existující soubory ``> '' (NEIMPLEMENTED pro 4.4alpha)

-e errexit

Nebude-li interaktivní, okamžitě opusťte, pokud selže nějaký netestovaný příkaz. Stav ukončení příkazu se považuje za explicitně testovaný, pokud se příkaz použije pro ovládání libovolného příkazu if elif, nebo pokud je příkazem levý operand operátoru `` & '' nebo `` || '.

-f noglob

Zakázat rozšíření názvu cesty .

-n noexec

Pokud není interaktivní, číst příkazy, ale nevykonávat je. To je užitečné pro kontrolu syntaxe shell skriptů.

-u nounset

Při pokusu o rozbalení proměnné, která není nastavena a pokud není shell interaktivní, napište zprávu standardní chybě, okamžitě opusťte. (NEIMPLEMENTED pro 4,4 alpha)

-v verbose

Shell zapisuje svůj vstup do standardní chyby při čtení. Užitečné pro ladění.

-x xtrace

Zadejte každý příkaz standardní chybě (před ním je před provedením `+ '.) Užitný pro ladění.

-q quietprofile

Pokud byly nastaveny volby - v nebo - x , nepoužívejte je při čtení inicializačních souborů, které jsou / etc / profile .profile a soubor specifikovaný proměnnou prostředí ENV .

- Já ignoruji

Ignorovat EOF od vstupu při interaktivním.

-i interaktivní

Vynucení shellu, aby se choval interaktivně.

-m monitoru

Zapněte kontrolu úlohy (nastavuje se automaticky při interaktivním nastavení).

-s stdin

Čtení příkazů ze standardního vstupu (nastaveno automaticky, pokud nejsou k dispozici žádné argumenty). Tato volba nemá žádný vliv, pokud je nastavena po spuštění shellu (tj. S množinou (1)).

-V vi

Aktivuje vestavěný editor příkazového řádku vi (1) (vypne - pokud byl nastaven).

-E emaky

Aktivuje vestavěný editor emacs (1) příkazového řádku (vypne - pokud byl nastaven).

-b upozornit

Povolit asynchronní oznámení ukončení úlohy pozadí. (NEIMPLEMENTED pro 4,4 alpha)

Lexikální struktura

Skořápka čte vstupy v podobě řádků ze souboru a rozdělí je do slov na prázdných místech (prázdná místa a záložky) a na určité posloupnosti znaků, které jsou specifické pro shell nazývané "operátory". Existují dva typy operátorů: operátory kontroly a operátory přesměrování (jejich význam je popsán později). Následuje seznam provozovatelů:

"Operátoři řízení:"

& && (); ;; | ||

"Operátor přesměrování:"

<>> | << >> <&> & << - <>

Citace

Citace se používá k odstranění zvláštního významu některých znaků nebo slov do shellu, jako jsou operátory, mezery nebo klíčová slova. Existují tři typy citací: odpovídající jednorázové uvozovky, odpovídající dvojité uvozovky a zpětné lomítko.

Obrácené lomítko

Zpětné lomítko zachovává doslovný význam následujícího znaku, s výjimkou Aq newline. Zpětné lomítko, které předchází Aq newline, se považuje za pokračování v řádku.

Jednoduché nabídky

Zapínání znaků v jednoduchých uvozovkách zachovává doslovný význam všech znaků (s výjimkou jednoduchých uvozovek, což znemožňuje uvést jednočinné uvozovky do jednoznačného řetězce).

Dvojité uvozovky

Uložení znaků uvnitř dvojitých uvozovek zachovává doslovný význam všech znaků, s výjimkou dolarsign ($) backquote (`) a zpětné lomítko (\) Zpětné lomítko uvnitř dvojitých uvozovek je historicky podivné a slouží k citování pouze následujících znaků:

$ `\

Jinak to zůstane doslovné.

Vyhrazená slova

Vyhrazená slova jsou slova, která mají zvláštní význam pro shell a jsou rozpoznána na začátku řádku a po operátorovi řízení. Následující jsou vyhrazená slova:

! Ta elif ta Ta ta, zatímco Ta případ

jiný Ta pro Ta pak Ta {Ta}

děláš Ta až do Ta, pokud je Ta esac

Jejich význam je diskutován později.

Aliasy

Alias ​​je název a odpovídající hodnota nastavená pomocí příkazu vestavěného aliasu (1). Kdykoli se může vyskytnout vyhrazené slovo (viz výše) a po kontrole vyhrazených slov, shell zkontroluje slovo, zda se shoduje s aliasem. Pokud ano, nahrazuje jej ve vstupním proudu svou hodnotou. Například pokud existuje alias nazvaný `` lf '' s hodnotou `` ls -F '', pak vstup:

Pokud foobar

stal by se

ls -F foobar

Aliasy poskytují pohodlný způsob, jak mohou naivní uživatelé vytvářet zkratky pro příkazy, aniž by se museli naučit vytvářet funkce s argumenty. Mohou být také použity k vytvoření lexikálně obskurního kódu. Toto použití je odrazeno.

Příkazy

Shell interpretuje slova, která čte podle jazyka, jejíž specifikace je mimo rozsah této manuálové stránky (viz dokument BNF v dokumentu POSIX 1003.2). V podstatě však je čtena řádek a pokud první slovo řádku (nebo po operátorovi řízení) není vyhrazené slovo, pak shell rozpoznal jednoduchý příkaz. Jinak by mohl být rozpoznán komplexní příkaz nebo nějaký jiný speciální konstrukt.

Jednoduché příkazy

Pokud byl rozpoznán jednoduchý příkaz, shell provede následující akce:

  1. Přední slova formuláře `` name = value '' jsou odděleny a přiřazeny k prostředí jednoduchého příkazu. Operátoři přesměrování a jejich argumenty (jak je popsáno níže) jsou odebrány a uloženy pro zpracování.
  2. Zbývající slova se rozšiřují podle popisu v části nazvaném "Rozšíření" a první zbývající slovo se považuje za jméno příkazu a příkaz se nachází. Zbývající slova jsou považována za argumenty příkazu. Není-li výsledkem žádný název příkazu, pak přiřazení proměnných `` name = value '' rozpoznaných v položce 1 ovlivní aktuální shell.
  3. Přesměrování se provádí podle popisu v následující části.

Přesměrování

Přesměrování slouží ke změně, kde příkaz čte svůj vstup nebo odešle jeho výstup. Obecně platí, že přesměrování lze otevřít, zavřít nebo duplikovat existující odkaz na soubor. Celkový formát použitý pro přesměrování je:

[n] soubor redir-op

kde redir-op je jedním ze zmíněných operátorů přesměrování. Následuje seznam možných přesměrování. Bq n je volitelné číslo, jako v "3" (ne "Bq 3", který odkazuje na deskriptor souboru.

[n]> soubor

Přesměrovat standardní výstup (nebo n) do souboru.

[n]> | soubor

Stejné, ale přepsat volbu - C.

[n] >> soubor

Přidat standardní výstup (nebo n) do souboru.

[n]

Přesměrovat standardní vstup (nebo n) ze souboru.

[n1] <& n2

Duplicitní standardní vstup (nebo n1) z deskriptoru souborů n2.

[n] <& -

Zavřete standardní vstup (nebo n).

[n1]> & n2

Duplicitní standardní výstup (nebo n1) z n2.

[n]> & -

Zavřít standardní výstup (nebo n).

[n] <> soubor

Otevřete soubor pro čtení a zápis na standardním vstupu (nebo n).

Následující přesměrování se často nazývá "zde-dokument"

[n] << oddělovač

zde-doc-text ...

oddělovač

Veškerý text na po sobě jdoucích řádcích až k oddělovači je uložen pryč a zpřístupněn příkazu na standardním vstupu nebo deskriptoru souborů n, pokud je zadán. Pokud je oddělovač uvedený v počáteční řádce uveden, pak se zde-doc-text zachází doslovně, jinak se text podrobí rozšíření parametrů, nahrazení příkazu a aritmetické rozšíření (jak je popsáno v části "Rozšíření") 'Je-li operátor `` << -' 'namísto `` <<' ', pak se přední záložky v zde-doc-textu oddělí.

Vyhledávání a provádění

Existují tři typy příkazů: shellové funkce, vestavěné příkazy a běžné programy - a příkaz se hledá (podle jména) v tomto pořadí. Oba jsou vykonáni jiným způsobem.

Když je provedena funkce shellu, všechny parametry polohy (s výjimkou $ 0, které zůstávají nezměněné) jsou nastaveny na argumenty funkce shellu. Proměnné, které jsou explicitně umístěny v prostředí příkazu (umístěním jejich přiřazení před název funkce), jsou pro danou funkci lokální a jsou nastaveny na dané hodnoty. Pak se provede příkaz uvedený v definici funkce. Polohové parametry se při dokončení příkazu obnoví na původní hodnoty. To vše se děje v rámci aktuálního shellu.

Vestavěné skříně Shell jsou provedeny vnitřně do shellu, aniž by vytvořily nový proces.

V opačném případě, jestliže název příkazu neodpovídá funkci nebo vestavěné, bude příkaz vyhledán jako normální program v souborovém systému (jak je popsáno v následující části). Při spuštění běžného programu spustí program shell, předá argumenty a prostředí do programu. Pokud program není normálním spustitelným souborem (tj. Pokud nezačíná "kouzelným číslem", jehož reprezentace ASCII je "#!", Tak execve (2) vrátí Er ENOEXEC pak) shell interpretuje program subshell. Dětský shell se v tomto případě znovu inicializuje, takže efekt bude vypadat, jako kdyby byl spuštěn nový shell pro manipulaci s ad-hoc shellovým skriptem, s výjimkou toho, že místo hashových příkazů umístěných v nadřazeném shellu bude pamatováno dítě.

Všimněte si, že předchozí verze tohoto dokumentu a samotný zdrojový kód uvádějí zaváděcí a sporadicky skript shell bez magického čísla jako "shell".

Hledání cesty

Při hledání příkazu nejprve vypadá, zda má shell název funkce. Potom hledá vestavěný příkaz tímto jménem. Není-li vestavěný příkaz nalezen, nastane jedna ze dvou věcí:

  1. Názvy příkazů obsahující lomítko jsou jednoduše spuštěny bez provedení vyhledávání.
  2. Shell prohledává každou položku v PATH pro příkaz. Hodnota proměnné PATH by měla být série položek oddělených dvojtečkami. Každá položka se skládá z názvu adresáře. Aktuální adresář může být implicitně označen prázdným názvem adresáře nebo explicitně jedním obdobím.

Stav příkazu Exit

Každý příkaz má stav ukončení, který může ovlivnit chování ostatních příkazů shellu. Paradigmem je, že příkaz se ukončí s nulou pro normální nebo úspěch a nenulovou pro selhání, chybu nebo falešnou indikaci. Na stránce Mana pro každý příkaz by měly být uvedeny různé kódy výstupů a jejich význam. Kromě toho vestavěné příkazy vrátí kódy výstupu, stejně jako provedená funkce shellu.

Komplexní příkazy

Komplexní příkazy jsou kombinace jednoduchých příkazů s řídícími operátory nebo vyhrazenými slovy a společně vytvářejí větší komplexní příkaz. Obecněji, příkaz je jeden z následujících:

  • jednoduchý příkaz
  • potrubí
  • seznamu nebo složeného seznamu
  • složený příkaz
  • definice funkce

Pokud není uvedeno jinak, stav ukončení příkazu je stav posledního jednoduchého příkazu provedeného příkazem.

Potrubí

Potrubí je sekvence jednoho nebo více povelů oddělených řídicím operátorem |. Standardní výstup všech příkazů kromě posledního je připojen ke standardnímu vstupu dalšího příkazu. Standardní výstup posledního příkazu je zvyklý jako obvykle.

Formát potrubí je:

[!] příkaz1 command2 ...]

Standardní výstup příkazu1 je připojen ke standardnímu vstupu příkazu2. Standardní vstup, standardní výstup nebo oba příkazy se považují za přiřazené potrubím před jakýmkoli přesměrováním určeným operátory přesměrování, které jsou součástí příkazu.

Pokud potrubí není na pozadí (diskutováno později), shell čeká na dokončení všech příkazů.

Pokud rezervované slovo! nepředchází potrubí, stav ukončení je stav ukončení posledního příkazu zadaného v potrubí. V opačném případě je stav ukončení logickým NOT stavu ukončení posledního příkazu. To znamená, že pokud poslední příkaz vrátí nulu, stav ukončení je 1; Pokud poslední příkaz vrátí hodnotu větší než nula, stav ukončení je nulový.

Vzhledem k tomu, že přiřazení potrubí standardního vstupu nebo standardního výstupu nebo obojí probíhá před přesměrováním, může být změněno přesměrováním. Například:

$ command1 2> & 1 | command2

odešle standardní výstup i standardní chybu příkazu1 na standardní vstup příkazu2.

A; nebo způsobí, že předchozí AND-OR (popsaný další) bude proveden postupně; a & způsobí asynchronní provádění předchozího AND-OR-seznamu.

Všimněte si, že na rozdíl od některých ostatních shellů je každý proces v potrubí podřízený vyvolávajícímu shellu (pokud není vestavěný shell, v takovém případě se provede v aktuálním shellu - ale každý efekt, který má na prostředí, je vymazán).

Příkazy na pozadí -

Pokud je příkaz ukončen operátorem operátoru ampersand (&), shell provede příkaz asynchronně - to znamená, že shell nečeká, až příkaz dokončí před spuštěním dalšího příkazu.

Formát pro spuštění příkazu v pozadí je:

příkaz1 & [příkaz2 & ...]

Pokud shell není interaktivní, standardní vstup asynchronního příkazu je nastaven na / dev / null

Seznamy - Obecně řečeno

Seznam je sekvence nula nebo více příkazů oddělených novými řádky, středníky nebo ampersandy a volitelně ukončen jedním z těchto tří znaků. Příkazy v seznamu jsou spuštěny v pořadí, v jakém jsou napsány. Je-li za příkazem následován příkazem ampersand, příkaz spustí příkaz a okamžitě přejde k dalšímu příkazu; jinak čeká na ukončení příkazu, než přejde k dalšímu příkazu.

Operátoři seznamu zkratů

`` && '' a `` || '' jsou operátory seznamu AND-OR. `` && '' provede první příkaz a pak provede druhý příkaz iff stav výstupu prvního příkazu je nulový. `` || '' je podobný, ale provede druhý příkaz iff stav výstupu prvního příkazu je nenulový. `` && '' a `` || 'obě mají stejnou prioritu.

Konstrukce řízení průtoku - jestliže, pro případ

Syntaxe příkazu if je

pokud je seznam
pak seznam
[seznam elifů
pak seznam] ...
[seznam ostatních]
fi

Syntaxe příkazu while je

zatímco seznam
do seznamu
Hotovo

Tyto dva seznamy jsou opakovaně spouštěny, zatímco stav ukončení prvního seznamu je nulový. Příkaz do je podobný, ale má slovo až na místě, což způsobí, že se opakuje, dokud stav ukončení prvního seznamu nebude nulový.

Syntaxe příkazu pro je

pro proměnnou ve slově ...
do seznamu
Hotovo

Slova jsou rozbalena a seznam je opakovaně proveden s proměnnou nastavenou na každé slovo. a hotovo může být nahrazeno `` {'' a ``} ''

Syntaxe příkazu break a pokračování je

zlomit [num]
pokračovat [num]

Přerušení ukončí počet nejvnitřnějších smyček nebo smyček. Pokračujte dále s další iterací nejvnitřnější smyčky. Jsou implementovány jako vestavěné příkazy.

Syntaxe příkazu case je

slovo v případě
vzor) ;;
...
esac

Vzor může být vlastně jeden nebo více vzorků (viz popis Shell Patterns popsaných později), oddělených znaky `` ''.

Skupinové příkazy společně

Příkazy mohou být seskupeny také psaním

(seznam)

nebo

{list;

První z nich provede příkazy v podsvuku. Builtin příkazy seskupené do (seznam) neovlivní aktuální shell. Druhá forma nemá další plášť, takže je o něco efektivnější. Sdružování příkazů tímto způsobem umožňuje přesměrování jejich výstupu, jako kdyby byl jeden program:

{printf hello; printf world \ n ";}> pozdrav

Funkce

Syntaxe definice funkce je

jméno ()

Definice funkce je spustitelný příkaz; při spuštění instaluje funkci s názvem název a vrátí stav ukončení nula. Příkaz je obvykle seznam uzavřený mezi `` `` a ``} ''

Proměnné mohou být prohlášeny za lokální pro funkci pomocí místního příkazu. Toto by se mělo objevit jako první příkaz funkce a syntaxe je

místní [proměnná -] ...

Local je implementován jako vestavěný příkaz.

Pokud je proměnná provedena lokálně, zdědí počáteční hodnotu a exportované a readonly příznaky z proměnné se stejným názvem do okolního oboru, pokud existuje. V opačném případě je proměnná zpočátku nenastavena. Shell používá dynamické určování rozsahu, takže pokud vytvoříte proměnnou x lokální pro funkci f, která potom volá funkci g, odkazy na proměnnou x vytvořenou uvnitř g se budou vztahovat k proměnné x deklarované uvnitř f, nikoliv pro globální proměnnou s názvem x .

Jediným speciálním parametrem, než který lze provést na místní úrovni, je `` - '' Vytváření `` - '' místních libovolných možností shellu změněných příkazem set v rámci funkce, která má být vrácena zpět k původním hodnotám.

Syntaxe příkazu návratu je

návrat [exitstatus

Ukončí současně vykonávanou funkci. Návrat je implementován jako vestavěný příkaz.

Proměnné a parametry

Shell udržuje sadu parametrů. Parametr označený jménem se nazývá proměnná. Při spuštění prostředí přepne všechny proměnné prostředí do proměnných prostředí. Nové nové proměnné lze nastavit pomocí formuláře

name = hodnota

Proměnné nastavené uživatelem musí mít název sestávající pouze z abecedy, číslic a podtržítek - první z nich nesmí být číselná. Parametr může být také označen číslem nebo speciálním znakem, jak je vysvětleno níže.

Polohové parametry

Poziční parametr je parametr označený číslem (n> 0). Skořepina je zpočátku nastaví na hodnoty argumentů příkazové řádky, které se řídí jménem skriptovacího shellu. Sada (1) může být také použita pro nastavení nebo resetování.

Zvláštní parametry

Zvláštním parametrem je parametr označený jedním z následujících zvláštních znaků. Hodnota parametru je uvedena vedle jejího znaku.

* * *

Rozbalí se na polohové parametry, počínaje jedním. Když expanze nastane v rámci dvojitého řetězce , rozšiřuje se na jedno pole s hodnotou každého parametru odděleného prvním znakem proměnné IFS nebo pomocí , pokud je IFS nenastaveno.

@

Rozbalí se na polohové parametry, počínaje jedním. Když expanze nastane v rámci dvojitých uvozovek, každý poziční parametr se rozšiřuje jako samostatný argument. Pokud neexistují žádné polohové parametry, rozšíření @ generuje nulové argumenty, i když @ je dvojitá. Co to v podstatě znamená například, že $ 1 je `` abc '' a $ 2 je `` def ghi '', pak Qq $ @ se rozšiřuje na dva argumenty:

abc def ghi

#

Rozšiřuje se na počet polohových parametrů.

?

Rozšiřuje se na stav ukončení posledního potrubí.

- (Hyphen.)

Rozbalí se na příznaky aktuální volby (názvy jednopísmenných voleb zřetězené do řetězce), které byly zadány při vyvolání, zadaným vestavěným příkazem nebo implicitně pomocí shellu.

$

Rozšiřuje se na ID procesu vyvolaného shellu. Subshell zachovává stejnou hodnotu $ jako její rodič.

!

Rozšiřuje se na ID procesu posledního příkazu pozadí, který byl proveden z aktuálního shellu. U potrubí je identifikátor procesu posledním příkazem v potrubí.

0 (Zero.)

Rozbalí se na název skriptu shell nebo shellu.

Rozšíření slov

Tato klauzule popisuje různé rozšíření, která se provádějí na slovech. Ne všechna rozšíření jsou prováděna pro každé slovo, jak je vysvětleno později.

Rozšíření Tilde, rozšíření parametrů, nahrazení příkazů, aritmetické expanze a odebrání citací, které se vyskytují v rámci jediného slova rozbalit do jediného pole. Jedná se pouze o rozdělení pole nebo rozšíření cesty, které mohou vytvořit několik polí z jediného slova. Jedinou výjimkou z tohoto pravidla je rozšíření zvláštního parametru @ uvnitř dvojitých uvozovek, jak bylo popsáno výše.

Pořadí rozšiřování slov je:

  1. Rozšíření Tilde, rozšíření parametrů, nahrazení příkazů, aritmetická rozšíření (všechny se vyskytují současně).
  2. Rozdělení pole se provádí na polích generovaných krokem (1), pokud není proměnná IFS null.
  3. Rozšíření názvu cesty (pokud není nastavena hodnota f ).
  4. Odstranění citace.

$ Znak se používá k zavedení rozšíření parametrů, náhrady příkazu nebo aritmetického vyhodnocení.

Tilde Expansion (nahrazení domovského adresáře uživatele)

Slovo začínající nekótovaným znakem tilde (~) je vystaveno rozšíření tilde. Všechny znaky až do lomítka (/) nebo na konec slova se považují za uživatelské jméno a nahrazují se domovským adresářem uživatele. Pokud uživatelské jméno chybí (jako v ~ / foobar), tilde je nahrazen hodnotou proměnné HOME (domovský adresář aktuálního uživatele).

Rozšíření parametru

Formát rozšíření parametrů je následující:

kde výraz se skládá ze všech znaků, dokud odpovídající "`} '' 'Jakékoli ``}' 'uniklo zpětným lomítkem nebo uvnitř citovaného řetězce a znaky v embedded aritmetické expanzi, náhradách příkazů a proměnlivých expanzi nejsou zkoumány při určování odpovídající ``} ''

Nejjednodušší formulář pro rozšíření parametrů je:

Hodnota případného parametru je nahrazena.

Název parametru nebo symbol mohou být přiloženy do závor, které jsou volitelné, s výjimkou pozičních parametrů s více než jednou číslicí nebo po parametru je následován znakem, který by mohl být interpretován jako součást jména. Pokud do dvojitých uvozovek dojde k rozšíření parametru:

  1. Rozšíření názvu cesty se neprovádí na základě výsledků rozšíření.
  2. Rozdělení pole není provedeno na výsledcích rozšíření, s výjimkou @.

Kromě toho lze rozšíření parametru změnit pomocí jednoho z následujících formátů.

Použijte výchozí hodnoty. Pokud je parametr nenastavený nebo nulový, nahrazuje se rozšířením slova; jinak je hodnota parametru nahrazena.

Přiřadit výchozí hodnoty. Pokud je parametr nenastaven nebo null, rozšíření slova je přiřazeno parametru. Ve všech případech je konečná hodnota parametru nahrazena. Tímto způsobem lze přiřadit pouze proměnné, nikoliv poziční parametry nebo speciální parametry.

Označte chybu, pokud je Null nebo Unset. Pokud je parametr nenastavený nebo nulový, rozšíření slova (nebo zpráva, že je vypnuto, pokud je slovo vynecháno) je zapsáno do standardní chyby a shell se ukončí s nenulovým stavem ukončení. V opačném případě je hodnota parametru nahrazena. Interaktivní shell nemusí skončit.

Použijte alternativní hodnotu. Je-li parametr nenastaven nebo null, nahrazuje se null; v opačném případě se nahrazuje rozšíření slova.

V předem zobrazených rozšířeních parametrů použije dvojtečka ve formátu výsledky testu pro parametr, který je nenulový nebo nulový; Vynechání dvojtečky vede k testování parametru, který je pouze nenastavený.

Délka řetězce. Délka znaků v hodnotě parametru.

Následující čtyři varianty rozšíření parametrů zajišťují zpracování podřetězce. V každém případě se pro vyhodnocení vzorků použije vzorová shoda (viz Shell Patterns), spíše než regulární výrazová notace. Je-li parametr * nebo @, výsledek rozšíření není specifikován. Uzavření úplného parametru expanzního řetězce v dvojitých uvozovkách nezpůsobuje uvedení následujících čtyř druhů znaků vzorku, zatímco citování znaků v rovinách má tento účinek.

Odstraňte nejmenší vzor příhozu. Slovo se rozšiřuje, aby vytvořilo vzor. Rozšíření parametru pak vede k parametru, přičemž nejmenší část přípony odpovídá odstraněnému vzoru.

Odstraňte největší šablonu příhozu. Slovo se rozšiřuje, aby vytvořilo vzor. Rozšíření parametru pak vyústí v parametr, přičemž největší část přípony odpovídá odstraněnému vzoru.

Odstraňte nejmenší vzorek předpony. Slovo se rozšiřuje, aby vytvořilo vzor. Rozšíření parametru má za následek parametr, přičemž nejmenší část prefixu odpovídá odstraněnému vzoru.

Odstraňte největší vzorek předpony. Slovo se rozšiřuje, aby vytvořilo vzor. Rozšíření parametru má za následek parametr, přičemž největší část prefixu odpovídá odstraněnému vzoru.

Command Substitution

Nahrazení příkazu umožňuje nahrazení výstupu příkazu namísto samotného příkazového jména. Náhrada příkazu nastane, když příkaz je uzavřen následujícím způsobem:

$ (příkaz)

nebo Po `` backquoted '' verze Pc:

`command '

Shell rozšiřuje nahrazení příkazu příkazem executing v prostředí subshell a nahrazuje nahrazení příkazu standardním výstupem příkazu a odstraní sekvence jednoho nebo více s na konci nahrazení. (Embedded s před koncem výstupu nejsou odstraněny, nicméně během rozštěpování pole mohou být přeloženy do s, v závislosti na hodnotě IFS a uvedení, které je platné.)

Aritmetické rozšíření

Aritmetická expanze poskytuje mechanismus pro hodnocení aritmetického vyjádření a nahrazení jeho hodnoty. Formát pro aritmetickou expanzi je následující:

$ ((výraz))

Výraz se zachází jako s dvojitými uvozovkami, s výjimkou toho, že dvojitá uvozovka uvnitř výrazu není zvlášť upravena. Shell rozšiřuje všechny znaky ve výrazu pro rozšíření parametrů, nahrazení příkazu a odebrání citace.

Pak skořepina to považuje za aritmetický výraz a nahrazuje hodnotu výrazu.

Rozdělení bílé mezer (rozdělení pole)

Po rozšíření parametru, nahrazení příkazu a aritmetické expanzii skenuje skenování výsledků rozšíření a substitucí, které nedošlo k dvojitým uvozovkám pro rozdělení polí a může dojít k několika polím.

Skořepina zachází s každým znakem IFS jako oddělovačem a pomocí oddělovačů rozdělí výsledky rozšíření parametrů a nahrazení příkazů do polí.

Rozšíření názvu cesty (generování názvu souboru)

Pokud není nastaven parametr - f , generování názvu souboru se provede po dokončení rozdělení slov. Každé slovo je zobrazeno jako série vzorků oddělených lomítkem. Proces rozšíření nahrazuje slovo jmény všech existujících souborů, jejichž jména mohou být vytvořena nahrazením každého vzoru řetězcem, který odpovídá zadanému vzoru. Existují dvě omezení: za prvé, vzorek nemůže odpovídat řetězci obsahující lomítko a za druhé, vzorec nemůže odpovídat řetězci začínajícímu s obdobím, pokud první znak vzorku není období. Následující část popisuje vzory používané pro rozšíření názvů tras a příkazu case (1).

Shell vzory

Vzor se skládá z normálních znaků, které se sami shodují, a meta-znaků. Meta-znaky jsou ``! `` `* '` ``? `' A` `['' Tyto postavy ztrácejí své zvláštní významy, pokud jsou citovány. Při provedení příkazu nebo proměnné náhrady a doložka nebo zadní uvozovky nejsou dvojitě citovány, proměnná nebo výstup příkazu se pro tyto znaky skenuje a změní se na meta-znaky.

Hvězdička (`` * '') odpovídá libovolnému řetězci znaků. Otazník odpovídá libovolnému jednotlivému znaku. Levá konzola (`` ['') představuje třídu znaků. Konec třídy znaků je označen symbolem (``] ''), jestliže chybí ``] '', pak `` ['' odpovídá a `` ['' spíše než uvedení třídy znaků. Třída znaků se shoduje s libovolnými znaky mezi hranatými závorkami. Rozsah znaků lze zadat pomocí znaménka mínus. Třída znaků může být doplněna tím, že vykřičník je prvním znakem třídy znaků.

Chcete-li zahrnout znak "`] '' do třídy znaků, zadejte první znak (po "if"). Chcete-li zahrnout znak mínus, zadejte jej první nebo poslední znak

Builtins

Tato část uvádí vestavěné vestavěné příkazy, protože je třeba provést některé operace, které nelze provést samostatným procesem. Kromě toho existuje několik dalších příkazů, které mohou být vestavěny pro efektivitu (např. Echo 1).

:

Příkaz null, který vrátí hodnotu 0 (true).

. soubor

Příkazy v zadaném souboru jsou čteny a provedeny shell.

alias [ name [ = řetězec ... ]]

Pokud je zadán název = řetězec , shell definuje název aliasu s hodnotovým řetězcem Pokud je zadán pouze název , vytiskne se hodnota aliasu. Bez argumentů alias vestavěný vytiskne názvy a hodnoty všech definovaných aliasů (viz unalias)

bg [ práce] ...

Pokračujte v zadaných úlohách (nebo v aktuální úloze, pokud nejsou zadány žádné úlohy) na pozadí.

příkaz příkaz arg ...

Proveďte zadaný vestavěný příkaz. (To je užitečné, pokud máte funkci shellu se stejným názvem jako vestavěný příkaz.)

cd [ adresář ]

Přepnutí do zadaného adresáře (výchozí $ HOME) Pokud se položka pro CDPATH objeví v prostředí příkazu cd nebo je nastavena proměnná prostředí CDPATH a název adresáře nezačne lomítkem, budou vyhledány adresáře uvedené v CDPATH pro zadaný adresář. Formát CDPATH je stejný jako formát PATH V interaktivním shellu bude příkaz cd vytisknout název adresáře, na který se skutečně přepnul, jestliže se liší od jména, které uživatel dal. Ty se mohou lišit buď proto, že byl použit mechanismus CDPATH, nebo protože byla překročena symbolická vazba.

eval string ...

Spojte všechny argumenty s mezerami. Pak znovu analyzujte a spusťte příkaz.

exec [ příkaz arg ... ]

Pokud příkaz není vynechán, proces shellu je nahrazen specifikovaným programem (který musí být skutečný program, nikoliv integrovaný shell nebo funkce). Jakékoli přesměrování příkazu exec jsou označeny jako trvalé, aby nebyly zrušeny po dokončení příkazu exec .

exit [ exitstatus ]

Ukončete proces shellu. Pokud je exitstateus daný, použije se jako stav výstupu shellu; jinak se použije stav ukončení předchozího příkazu.

export název ...

export -p

Zadané názvy jsou exportovány tak, aby se objevily v prostředí následných příkazů. Jediný způsob, jak exportovat proměnnou, je zrušit ji. Skořepina umožňuje nastavit hodnotu proměnné v okamžiku, kdy je exportována psaním

název exportu = hodnota

Bez argumentů obsahuje příkaz export seznam názvů všech exportovaných proměnných. Pomocí volby - p je výstup vhodně formátován pro neinteraktivní použití.

fc [- e editor ] [ první [ poslední ]]

fc -l [- nr ] [ první [ poslední ]]

fc -s [ starý = nový ] [ první ]

Fc vestavěné seznamy nebo editace a re-executes příkazy dříve zadané do interaktivního shellu.

-e editor

Pomocí editoru pojmenovaného editorem upravte příkazy. Řetězce editoru je název příkazu, který je předmětem vyhledávání pomocí proměnné PATH . Hodnota v proměnné FCEDIT se použije jako výchozí, když - e není zadán. Je-li hodnota FCEDIT null nebo nenastavena, použije se hodnota proměnné EDITOR . Pokud je editor EDITOR null nebo unset, ed (1) se používá jako editor.

-l (ell)

Seznam příkazů spíše než vyvolání editoru. Příkazy jsou zapsány v pořadí označeném prvním a posledním operandem, které jsou ovlivněny příkazem - r s každým příkazem předcházejícím příkazovým číslem.

-n

Potlačení čísel příkazů při zápisu pomocí -l.

-r

Převrátit pořadí příkazů uvedených (s - l nebo upravených (ani s - l ani - s)

-s

Znovu spusťte příkaz bez vyvolání editoru.

První

poslední

Vyberte příkazy, které chcete vypsat nebo upravit. Počet předchozích příkazů, ke kterým lze přistupovat, je určen hodnotou proměnné HISTSIZE . Hodnota prvního nebo posledního nebo obojího je jedna z následujících hodnot:

[+] číslo

Kladné číslo reprezentující číslo příkazu; čísla příkazu lze zobrazit pomocí možnosti - l .

-číslo

Záporné desítkové číslo představuje příkaz, který byl dříve proveden počtem příkazů. Například -1 je okamžitě předchozí příkaz.

řetězec

Řetězec označující poslední zadaný příkaz, který začíná tímto řetězcem. Pokud starý = nový operand není také zadán - s řetězcová forma prvního operandu nemůže obsahovat vložený rovný znak.

Následující proměnné prostředí ovlivňují provádění fc:

FCEDIT

Název editoru, který chcete použít.

HISTSIZE

Počet předchozích příkazů, které jsou přístupné.

fg [ práce ]

Přesuňte zadanou úlohu nebo aktuální úlohu do popředí.

getopts optstring var

Příkaz POSIX getopts nesmí být zaměňován s getopt odděleným Bell Labs (1).

Prvním argumentem by měla být řada písmen, z nichž každá může být případně doplněna dvojtečkou, která označuje, že volba vyžaduje argument. Zadaná proměnná je nastavena na možnost analyzovat.

Příkaz getopts zruší starší utilitu getopt (1) kvůli zpracování argumentů obsahujících mezery.

Getopts vestavěný může být použit pro získání možností a jejich argumentů ze seznamu parametrů. Při vyvolání příkazu getopts umístí hodnotu další možnosti z řetězce možností v seznamu v proměnné shell specifikované var a je to index v shell proměnné OPTIND Když je vyvolána shell, OPTIND je inicializován na 1. Pro každou volbu, která vyžaduje argument, getopts vestavěný umístit do proměnné shell OPTARG Pokud volba není povolena v optstring pak OPTARG bude unset.

optstring je řetězec rozpoznaných písmen možností. Je-li za písmenem za dvojtečkou, očekává se, že bude mít argument, který může nebo nemusí být od něj oddělen prázdným místem. Pokud není nalezen znak, který se očekává, getopts nastaví proměnnou var na ``? '' Getopts pak zruší OPTARG a zapíše výstup na standardní chybu. Zadáním dvojtečky jako prvního znaku optstring budou všechny chyby ignorovány.

Při dosažení poslední volby se vrátí nenulová hodnota. Pokud neexistují žádné zbývající argumenty, getopts nastaví var na speciální volbu `` - '' jinak nastaví var na ``? ''

Následující kódový fragment ukazuje, jak lze zpracovat argumenty pro příkaz, který může mít volby [a] a [b] a volbu [c], která vyžaduje argument.

zatímco getopts abc: f
dělat
případ $ f in
a | b) flag = $ f ;;
c) carg = $ OPTARG ;;
\?) echo $ USAGE; výstup 1;
esac
Hotovo
shift `expr $ OPTIND - 1`

Tento kód bude akceptovat některou z následujících možností:

cmd - souboru souboru
cmd -a -c soubor souboru arg
cmd -carg - soubor souboru
cmd -a -carg - soubor souboru

hash -rv příkaz ...

Shell udržuje hash tabulku, která si pamatuje umístění příkazů. Bez jakýchkoli argumentů příkaz hash vytiskne obsah této tabulky. Položky, které nebyly zkontrolovány od posledního příkazu cd, jsou označeny hvězdičkou; tyto položky mohou být neplatné.

S argumenty příkaz hash odebere zadané příkazy z tabulky hash (pokud nejsou funkce) a pak je najde. S volbou - v , haš vytiskne umístění příkazů, jak je najde. Možnost - r způsobí, že příkaz hash odstraní všechny položky v tabulce hash s výjimkou funkcí.

jobid [ práce ]

Vytiskněte ID procesu procesů v úloze. Pokud je argument úlohy vynechán, použije se aktuální úloha.

pracovní místa

Tento příkaz uvádí seznam všech procesů pozadí, které jsou dětem aktuálního procesu shellu.

pwd

Vytiskněte aktuální adresář. Vestavěný příkaz se může lišit od programu se stejným názvem, protože vestavěný příkaz si pamatuje, co je aktuální adresář, spíše než jeho opakování. To zrychluje. Pokud je však aktuální adresář přejmenován, vestavěná verze souboru pwd bude pokračovat v tisku starého názvu adresáře.

číst [- p prompt ] [- r ] proměnná ...

Příkaz se vytiskne, pokud je zadána volba - p a standardní vstup je terminál. Poté se na standardním vstupu čte řádek. Nový řádkový řádek se vymaže z řádku a řádek se rozdělí tak, jak je popsáno v části o rozdělení slov výše a kusy jsou přiřazeny k proměnným v pořadí. Musí být zadána alespoň jedna proměnná. Pokud je více kusů než proměnné, zbývající části (společně s znaky v IFS, které je oddělily) jsou přiřazeny poslední proměnné. Pokud je více proměnných než kusů, zbývající proměnné jsou přiřazeny nulovému řetězci. Integrovaný zápis bude znamenat úspěch, pokud nenalezne EOF na vstupu, v takovém případě se vrátí chyba.

Ve výchozím nastavení, pokud není zadána volba - r , zpětné lomítko `` \ '' se chová jako znak úniku, což způsobí doslova zacházet s následujícím znakem. Pokud je zpětné lomítko následováno novou čárou, zpětné lomítko a nový řádek budou smazány.

readonly jméno ...

readonly -p

Zadané názvy jsou označeny pouze jako čtení, takže nemohou být pozměněny nebo zrušeny. Skořepina umožňuje nastavit hodnotu proměnné a současně ji označit pouze pro čtení

readonly name = hodnota

Bez argumentů příkaz readonly uvádí jména všech proměnných pouze pro čtení. Pomocí volby - p je výstup vhodně formátován pro neinteraktivní použití.

nastavit [{- volby | + volby - arg ... ]

Příkaz set provádí tři různé funkce.

Bez argumentů obsahuje seznam všech proměnných shellu.

Jsou-li zadány možnosti, nastaví příznaky specifikované volby nebo je vymaže, jak je popsáno v části nazvané Zpracování seznamu argumentů Sx.

Třetím použitím příkazu set je nastavit hodnoty polohových parametrů shellu na zadané argumenty. Chcete-li změnit parametry polohy bez změny libovolných možností, použijte jako první argument "- -". Pokud nejsou přítomny žádné argumenty, příkaz set vymaže všechny polohové parametry (ekvivalentní spuštění `` shift $ #. ''

variabilní hodnota

Přiřadí hodnotu proměnné. (Obecně je lepší zapisovat proměnnou = hodnotu namísto použití setvar setvar je určen pro použití ve funkcích, které přiřazují hodnoty proměnným, jejichž jména jsou předávána jako parametry.)

posun [ n ]

Přesuňte polohové parametry nkrát. Směn nastaví hodnotu $ 1 na hodnotu $ 2 hodnotu $ 2 na hodnotu $ 3 a tak dále, snižující hodnotu $ # o jednu. Pokud je n větší než počet polohových parametrů, posun vydá chybovou zprávu a ukončí stav návratu 2.

časy

Vytiskněte nahromaděné uživatelské a systémové časy pro shell a pro procesy běžící ze shellu. Stav návratu je 0.

trap akční signál ...

Způsobí, že shell analyzuje a provede akci, když je přijat některý ze specifikovaných signálů. Signály jsou určeny číslem signálu. Pokud je signál 0, akce se provede při ukončení shellu. akce může být nulová nebo `` - '' první způsobí, že zadaný signál bude ignorován a druhý způsobí výchozí akci. Když shell vyklouzne podsvuku , resetuje signály, které byly zachyceny (ale ne ignorovány) na výchozí akci. Příkaz trap nemá žádný vliv na signály ignorované při vstupu do shellu.

zadejte [ název ... ]

Interpretovat každé jméno jako příkaz a vytisknout rozlišení hledání příkazu. Možná řešení jsou: klíčové slovo shell, alias, shell builtin , příkaz, sledovaný alias a nenalezen. Pro aliasy se vytiskne rozšíření aliasu; pro příkazy a sledované aliasy se vytiskne úplný název cesty příkazu.

ulimit [- H -S ] [- a -tfdscmlpn [ hodnota ]]

Zeptejte se nebo nastavte tvrdé nebo měkké limity procesů nebo nastavte nové limity. Volba mezi tvrdým limitem (který žádný proces nesmí narušit a který nesmí být vznesen poté, co byl snížen) a měkká meze (která způsobuje, že procesy mají být signalizovány, ale nemusí být nutně zabíjeny a které mohou být zvýšeny) se provádí s tyto příznaky:

-H

nastavte nebo zeptejte se na tvrdé limity

-S

nastavte nebo zeptejte se na měkké limity. Není-li zadán žádný znak - H ani - S , zobrazí se měkká mez nebo jsou nastaveny oba limity. Pokud jsou zadány oba, vyhraje poslední.

Limit, který má být dotazován nebo nastaven, je tedy zvolen zadáním jedné z těchto příznaků:

-A

zobrazit všechny aktuální limity

-t

zobrazit nebo nastavit limit na čas CPU (v sekundách)

-F

zobrazit nebo nastavit limit pro největší soubor, který lze vytvořit (v bloku 512 bajtů)

-d

zobrazit nebo nastavit limit velikosti segmentu dat procesu (v kilobajtech)

-s

zobrazit nebo nastavit limit velikosti procesoru (v kilobajtech)

-C

zobrazte nebo nastavte limit pro největší velikost jádra, která může být vytvořena (v bloku 512 bajtů)

-m

zobrazit nebo nastavit limit na celkovou fyzickou paměť, kterou může proces používat (v kilobajtech)

-l

zobrazit nebo nastavit limit na kolik paměti může proces zablokovat s mlock (2) (v kilobajtech )

-p

zobrazit nebo nastavit limit počtu procesů, které může mít současně tento uživatel

-n

zobrazit nebo nastavit limit počtu souborů, které může proces otevřít najednou

Není-li zadán žádný z těchto parametrů, je zobrazen nebo nastaven limit velikosti souboru. Pokud je zadána hodnota, je limit nastaven na toto číslo; jinak se zobrazí aktuální limit.

Limity libovolného procesu lze zobrazit nebo nastavit pomocí nástroje sysctl (8).

umask [ maska ]

Nastavte hodnotu umask (viz umask (2)) na zadanou osmičkovou hodnotu. Pokud je argument vynechán, vytiskne se hodnota umask.

unalias [- a ] [ název ]

Pokud je zadán název , shell odstraní tento alias. Pokud je zadáno - a , odstraní se všechna aliasy.

zrušit jméno ...

Zadané proměnné a funkce jsou deaktivované a nevyexportovány. Pokud daný název odpovídá proměnné i funkci, jsou proměnná i funkce zrušena.

počkat [ práce ]

Počkejte, než zadaná úloha dokončí a vrátí stav ukončení posledního procesu v úloze. Pokud je argument vynechán, počkejte na dokončení všech úloh a vrátit stav ukončení nula.

Úpravy příkazového řádku

Když se sh používá interaktivně z terminálu, aktuální příkaz a historie příkazů (viz fc v Sx Builtins) lze editovat pomocí editace příkazového řádku vi-mode. Tento režim používá níže popsané příkazy podobné podskupině popsané na stránce vi man. Příkaz `set '-o vi umožňuje editaci v režimu vi a umístit do režimu vkládání vi. V režimu vi-mode lze přepínat mezi režimem vložení a příkazovým režimem. Editor není zde úplně popsán, ale bude v pozdějším dokumentu. Je to podobné jako vi: typování Aq ESC vás hodí do příkazového režimu příkazu VI. Bít Aq návrat v příkazovém režimu předá linku do shellu.

Důležité: Použijte příkaz man ( % man ), abyste zjistili, jaký příkaz se používá v konkrétním počítači.