Řešení 1:Použití substituce procesu
Nejpohodlnějším způsobem, jak toho dosáhnout, je použití substituce procesu. V bash vypadá syntaxe takto:
foo -o >(other_command)
(Všimněte si, že se jedná o bashismus. Podobná řešení existují i pro jiné shelly, ale sečteno a podtrženo je, že to není přenosné.)
Řešení 2:Explicitní použití pojmenovaných kanálů
Výše uvedené můžete provést explicitně / ručně takto:
-
Vytvořte pojmenovaný kanál pomocí
mkfifo
příkaz.mkfifo my_buf
-
Spusťte další příkaz s tímto souborem jako vstup
other_command < my_buf
-
Spusťte
foo
a nechte jej zapsat jeho výstup domy_buf
foo -o my_buf
Řešení 3:Použití /dev/stdout
Můžete také použít soubor zařízení /dev/stdout
takto
foo -o /dev/stdout | other_command
Můžete použít kouzlo UNIXu a vytvořit pojmenované potrubí :)
-
Vytvořte potrubí
$ mknod -p mypipe
-
Spusťte proces, který čte z kanálu
$ second-process < mypipe
-
Spusťte proces, který zapisuje do roury
$ foo -o mypipe
Aby byl stackoverflow šťastný, dovolte mi napsat dostatečně dlouhou větu, protože mé navrhované řešení má pouze 18 znaků místo požadovaných 30+
foo -o /dev/stdout
Pojmenované kanály fungují dobře, ale máte k dispozici hezčí a přímější syntaxi prostřednictvím substituce procesu bash, která má další výhodu v tom, že nepoužíváte trvale pojmenované kanály, které je třeba později odstranit (náhrada procesu používá dočasné pojmenované kanály za scénou):
foo -o >(other command)
Také, pokud chcete výstup převést do svého příkazu a také uložit výstup do souboru, můžete provést toto:
foo -o >(tee output.txt) | other command