Substituce příkazu - Command substitution
v výpočetní, substituce příkazů je zařízení, které umožňuje a příkaz má být spuštěn a jeho výstup vložen zpět na příkazový řádek jako argumenty k jinému příkazu. Substituce velení se poprvé objevila v Bourneova skořápka,[1] představen s Verze 7 Unix v roce 1979 a zůstal charakteristikou všech později Unix skořápky. Funkce byla od té doby přijata v jiných programovací jazyky také, včetně Perl, PHP, Rubín a Microsoft Powershell pod Okna. Objevuje se také v Microsoftu CMD.EXE v PRO
velení a ( )
příkaz.
Syntaxe a sémantika
Mušle obvykle implementují substituci příkazů vytvořením dětský proces spustit první příkaz s jeho standardní výstup potrubí zpět do shellu, který přečte tento výstup, analýza to do slov oddělených mezery. Protože shell nemůže vědět, že má veškerý výstup z podřízeného prvku, dokud se potrubí nezavře nebo dítě nezemře, počká do té doby, než zahájí další podřízený proces, aby spustil druhý příkaz.
Tento C shell příklad ukazuje, jak by se dalo hledat všechny C soubory obsahující tětiva malloc
použitím fgrep
a poté upravte všechny nalezené pomocí vi
editor. Zde zobrazený syntaktický zápis, `
... `
, použitím zpětné uvozovky tak jako oddělovače, je původní styl a je podporován všemi běžnými unixovými shelly.
#! / bin / cshvi `fgrep -l malloc * .c`
Obě strany vznesly námitky syntax, jak je to napsáno, a sémantika, jak to funguje.
I když je snadné psát, což je důležitý faktor pro interaktivní příkazový procesor, syntaxe byla kritizována jako nepříjemná pro vnoření a vložení jedné substituce příkazu do jiného, protože levý i pravý oddělovač jsou stejné.[2] The KornShell (ksh)[3] vyřešil to alternativní notací, $(
... )
výpůjčka z notového stylu použitého pro variabilní substituce. Dnes většina syntaxí UNIX tuto syntaxi podporuje. Microsoft PowerShell také používá tuto notaci se stejnou sémantikou.
#! / bin / bashvi $(fgrep -l malloc * .c)
Kritizována byla také sémantika rozdělování výstupu na slova v mezerách. Na začátku to fungovalo dobře Unix systémy, kde názvy souborů nikdy neobsahovaly mezery, ale na moderní to vůbec nefunguje Okna a Linux systémy, kde názvy souborů určitě mohou obsahovat mezery.[4] V kterémkoli z těchto předchozích příkladů, pokud se některý z názvů souborů shoduje s *.C
divoká karta obsahuje mezeru, bude název souboru rozdělen na dva samostatné argumenty vi
, zjevně ne to, co bylo zamýšleno. Hamilton C shell vyřešil to dvojitou notací uvozovek, ``
... ``
, který se analyzuje na slova pouze při zalomení řádku.[5]
Toto je příklad nahrazení příkazu pomocí ()
operátor v PowerShell:
$ MyVariable = (je)echo $ MyVariable
Substituce výrazu
Příbuzné zařízení, substituce výrazu, se nachází v jazycích Společný Lisp a Systém, vyvolané pomocí operátoru čárka ve výrazu označeném operátorem zpětná citace (nebo „kvazikvotace“), a v ABC pomocí výrazu uzavřeného mezi zpětnými uvozovkami uvnitř textového displeje (řetězec doslovný ). Například příkaz ABC NAPISUJTE 2 + 2 = `2 + 2` '
produkuje výstup 2 + 2 = 4.
Viz také
Reference
- ^ Dahdah, Howard. A-Z programovacích jazyků: Bourne shell, nebo sh, Podrobný rozhovor se Stevem Bournem, tvůrcem Bourne shellu, nebo sh, Computerworld, 5. března 2009.
- ^ Unix Power Tools: 45.31 Nested Command Substitution.
- ^ Rosenblatt, Bill; Arnold Robbins (2002). Naučit se Korn Shell (2. vyd.). O'Reilly Media, Inc. str. 127. ISBN 978-0-596-00195-7. Citováno 2010-07-20.
Syntaxe nahrazení příkazu je:
$ (Příkaz Unix)
Spustí se příkaz v závorkách a vše, co příkaz zapíše na standardní výstup (a na standardní chybu), se vrátí jako hodnota výrazu. - ^ Johnson, Chris (2009), „8“, Programování Pro Bash: Skriptování prostředí Linux, New York, NY: Springer-Verlag New York, Inc., s. 84, vyvoláno 19. prosince 2014,
Názvy souborů obsahující mezery jsou ohavností, ale v dnešní době jsou tak běžné, že skripty musí brát v úvahu jejich možnost (nebo bych měl říci nevyhnutelnost?). ... Výsledek nahrazení příkazu podléhá rozdělení slov
- ^ Hamilton C shell Uživatelská příručka: Přesměrování I / O: Substituce příkazů, Hamilton Laboratories, archivovány z originál dne 19. prosince 2014, vyvoláno 19. prosince 2014