Toto se nazývá substituce procesu.
3.5.6 Náhrada procesu
Substituce procesu umožňuje odkazovat na vstup nebo výstup procesu pomocí názvu souboru.
Seznam procesů běží asynchronně a jeho vstup nebo výstup se zobrazí jako název souboru. Tento název souboru je předán jako argument aktuálnímu příkazu v důsledku rozšíření. Pokud je použit formulář>(list), zápis do souboru poskytne vstup pro seznam. Pokud je použit formulář <(list), měl by být soubor předaný jako argument načten, aby se získal výstup seznamu. Všimněte si, že mezi
a levou závorkou se nesmí objevit žádná mezera, jinak by byl konstrukt interpretován jako přesměrování. Náhrada procesů je podporována na systémech, které podporují pojmenované kanály (FIFO) nebo metodu /dev/fd pro pojmenování otevřených souborů.
Není to jen bash, jak se původně objevilo v ksh, ale není to ve standardu posix.
Substituce procesů má pod kapotou dvě implementace. Na systémech, které podporují
/dev/fd
(většina unixových systémů) funguje volánímpipe(
) systémové volání, které vrací deskriptor souboru$fd
pro nový anonymní kanál a poté vytvoření řetězce/dev/fd/$fd
a nahradí to na příkazovém řádku. Na systémech bez/dev/fd
podpora, 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.
Můžete si vzpomenout na <( somecommand )
jako název souboru dočasného souboru obsahujícího výstup somecommand
. Jinými slovy,
utility < <( somecommand )
je zkratka pro
somecommand >tempfile
utility <tempfile
rm -f tempfile
A
utility <( somecommand )
je zkratka pro
somecommand >tempfile
utility tempfile # notice the lack of redirection here (utility expected to read from "tempfile")
rm -f tempfile
Podobně >( somecommand )
může být chápáno jako název souboru dočasného souboru, který bude vložen do somecommand
na jeho standardním vstupu. Jinými slovy,
utility > >( somecommand )
je zkratka pro
utility >tempfile
somecommand <tempfile
rm -f tempfile
A
utility >( somecommand )
by mohla být zkratka pro
mkfifo temppipe
somecommand <temppipe &
utility temppipe # utility is expected to write to "temppipe"
rm -f temppipe
(nebo něco podobného)