Často chci dodávat data s relativně krátkými řetězci (i když může být několik řádků) do programů příkazového řádku, které přijímají pouze vstup ze souborů (např. wdiff) opakovaným způsobem. Jistě mohu vytvořit jeden nebo více dočasných souborů, uložit tam řetězec a spustit příkaz s názvem souboru jako parametrem. Ale zdá se mi, že tento postup by byl vysoce neefektivní, pokud by se data skutečně zapisovala na disk a také by mohl disk poškodit více, než je nutné, pokud tento postup opakuji mnohokrát, např. pokud chci napájet jednotlivé řádky dlouhých textových souborů do wdiff. Existuje doporučený způsob, jak to obejít, řekněme pomocí pseudosouborů, jako jsou roury, k dočasnému uložení dat bez skutečného zápisu na disk (nebo zápisu pouze v případě, že překročí kritickou délku). Všimněte si, že wdiff používá dva argumenty, a pokud tomu rozumím, nebude možné vložit data pomocí něčeho jako wdiff <"text"
.
Přijatá odpověď:
Použijte pojmenovaný kanál. Pro ilustraci:
mkfifo fifo
echo -e "hello worldnnext linenline 3" > fifo
-e
řekne echo, aby správně interpretovalo escape nového řádku (n
). To se zablokuje, tj. váš shell se zasekne, dokud něco nepřečte data z roury.
Někde a ve stejném adresáři otevřete jiný shell:
cat fifo
Přečtete si ozvěnu, která uvolní druhou skořápku. Ačkoli roura existuje jako souborový uzel na disku, data, která jím prochází, nikoli; vše se odehrává v paměti. Můžete pozadí (&
) ozvěna.
Pipe má 64k vyrovnávací paměť (na linuxu) a stejně jako socket zablokuje zapisovač, když je plný, takže nepřijdete o data, pokud nezabijete předčasně zapisovač.