Substituce procesu - Process substitution
Ve výpočetní technice, substituce procesu je forma meziprocesová komunikace který umožňuje, aby se vstup nebo výstup příkazu zobrazil jako soubor. Příkaz je nahrazen v řádku, kde by se název souboru normálně vyskytoval, znakem příkazový shell. To umožňuje programům, které normálně přijímají pouze soubory, přímé čtení nebo zápis do jiného programu.
Dějiny
Substituce procesu byla k dispozici jako možnost kompilace pro ksh88, verze z roku 1988 KornShell z Bell Labs.[1] The rc shell poskytuje funkci jako "větvení potrubí" ve Windows Verze 10 Unix, vydané v roce 1990.[2] The Bash shell poskytla náhradu procesu nejpozději do verze 1.14 vydané v roce 1994.[3]
Příklad
Následující příklady používají syntaxi KornShell.
The Unix rozdíl příkaz normálně přijímá názvy dvou souborů k porovnání, nebo jeden název souboru a standardní vstup. Substituce procesu umožňuje jednomu přímo porovnat výstup dvou programů:
$ rozdíl <(třídit soubor1) <(třídit soubor2)
The <(příkaz)
expression řekne interpretu příkazu, aby se spustil příkaz a aby se jeho výstup zobrazil jako soubor. The příkaz může být libovolně složitý příkaz shellu.
Bez náhrady procesu jsou alternativy:
- Uložte výstup příkazů do dočasného souboru a poté tyto dočasné soubory přečtěte.
$ třídit file2> /tmp/file2.sorted$ třídit soubor1 | diff - /tmp/file2.tříděný$ rm /tmp/file2. roztříděno
- Vytvořit pojmenovaná roura (také známý jako FIFO ), začněte psát jeden příkaz do pojmenovaného kanálu na pozadí a poté spusťte druhý příkaz s pojmenovaným kanálem jako vstup.
$ mkfifo /tmp/sort2.fifo$ třídit file2> /tmp/sort2.fifo &$ třídit soubor1 | diff - /tmp/sort2.fifo$ rm /tmp/sort2.fifo
Obě alternativy jsou těžkopádnější.
Substituci procesu lze také použít k zachycení výstupu, který by normálně šel do souboru, a jeho přesměrování na vstup procesu. Bashova syntaxe pro zápis do procesu je > (příkaz)
. Zde je příklad použití tričko
, toaleta
a gzip
příkazy, které počítají řádky v souboru s wc -l
a komprimuje jej pomocí gzip
v jednom průchodu:
$ tričko>(wc -l>&2) | gzip> bigfile.gz
Výhody
Hlavní výhody náhrady procesu oproti jeho alternativám jsou:
- Jednoduchost: Příkazy lze zadávat in-line; není třeba nejprve ukládat dočasné soubory nebo vytvářet pojmenované kanály.
- Výkon: Čtení přímo z jiného procesu je často rychlejší než zápis dočasného souboru na disk a následné opětovné načtení. Tím se také ušetří místo na disku.
- Rovnoběžnost: Substituovaný proces může běžet souběžně s příkazem, který čte jeho výstup nebo zapisuje jeho vstup, s využitím multiprocesing zkrátit celkovou dobu výpočtu.
Mechanismus
Substituce procesu má pod kapotou dvě implementace. Na systémech, které podporují / dev / fd
(většina unixových systémů) funguje voláním trubka()
systémové volání, které vrací deskriptor souboru $ fd
pro nový anonymní kanál, pak vytvoření řetězce / dev / fd / $ fd
, a nahrazuje to na příkazovém řádku. Na systémech bez / dev / fd
podpora, to volá mkfifo
s novým dočasným názvem souboru k vytvoření pojmenovaného kanálu a nahradí tento název souboru na příkazovém řádku. Pro ilustraci příslušných kroků zvažte následující jednoduché nahrazení příkazů v systému s / dev / fd
Podpěra, podpora:
$ diff file1 <(třídit soubor2)
Kroky, které shell provádí, jsou:
- Vytvořte nový anonymní kanál. Tato trubka bude přístupná s něčím podobným
/ dev / fd / 63
; můžete to vidět pomocí příkazu jakoecho <(true)
. - Spusťte substituovaný příkaz na pozadí (
třídit soubor2
v tomto případě), přivede svůj výstup do anonymního kanálu. - Proveďte primární příkaz a nahraďte nahrazený příkaz cestou anonymního kanálu. V takovém případě by se celý příkaz mohl rozšířit na něco jako
diff file1 / dev / fd / 63
. - Po dokončení provádění zavřete anonymní kanál.
U pojmenovaných kanálů se provedení liší pouze vytvořením a odstraněním kanálu; jsou vytvořeny pomocí mkfifo
(který dostal nový dočasný název souboru) a odstraněn pomocí odpojit
. Všechny ostatní aspekty zůstávají stejné.
Omezení
Substituce procesu má některá omezení:
- Žádné hledání souboru: vytvořené „soubory“ nejsou viditelný, což znamená, že proces čtení nebo zápisu do souboru nelze provést náhodný přístup; musí číst nebo psát jednou od začátku do konce. Programy, které před otevřením výslovně zkontrolují typ souboru, mohou odmítnout práci s nahrazením procesu, protože „soubor“ vyplývající z nahrazení procesu není běžný soubor.
- Žádné výstupní kódy: "Není možné získat výstupní kód příkazu nahrazení procesu z prostředí, které vytvořilo náhradu procesu." [4]
Viz také
Reference
- ^ Rosenblatt, Bill; Robbins, Arnold (duben 2002). „Dodatek A.2“. Naučit se Korn Shell (2. vyd.). O'Reilly & Associates. ISBN 0-596-00195-9.
- ^ Duff, Tom (1990). Rc - prostředí pro systémy Plan 9 a UNIX. CiteSeerX 10.1.1.41.3287.
- ^ Ramey, Chet (18. srpna 1994). Poznámky k verzi Bash 1.14. Free Software Foundation. K dispozici vZdrojový archiv GNU verze 1.14.7 ke dni 12. února 2016.
- ^ „Substituce procesu“. Gregova Wiki. 27. června 2011.
Další čtení
- „Bash Reference Manual“. Projekt GNU. Free Software Foundation. 23. prosince 2009. Citováno 1. října 2011.
- Cooper, Mendel (30. srpna 2011). „Pokročilý průvodce skriptováním Bash“. Dokumentační projekt Linuxu. Citováno 1. října 2011.
- Frazier, Mitch (22. května 2008). „Substituce Bash procesu“. Linux Journal. Citováno 1. října 2011.