GNU/Linux >> Znalost Linux >  >> Linux

Náhrada procesu a potrubí?

Zajímalo by mě, jak rozumět následujícímu:

Vložení stdout příkazu do stdin jiného je mocná
technika. Ale co když potřebujete stdout více
příkazů? Zde přichází na řadu substituce procesů.

Jinými slovy, může substituce procesu dělat to, co potrubí umí?

Co může procesní substituce dělat, ale roura nikoli?

Přijatá odpověď:

Dobrým způsobem, jak zjistit rozdíl mezi nimi, je trochu experimentovat na příkazovém řádku. Navzdory vizuální podobnosti v použití < znak, dělá něco velmi odlišného než přesměrování nebo roura.

Použijme date příkaz pro testování.

$ date | cat
Thu Jul 21 12:39:18 EEST 2011

Toto je nesmyslný příklad, ale ukazuje, že cat přijal výstup date na STDIN a vyplivni to zpátky. Stejných výsledků lze dosáhnout substitucí procesu:

$ cat <(date)
Thu Jul 21 12:40:53 EEST 2011

To, co se stalo v zákulisí, však bylo jiné. Místo streamu STDIN cat byl ve skutečnosti předán název souboru, který potřeboval k otevření a přečtení. Tento krok můžete vidět pomocí echo místo cat .

$ echo <(date)
/proc/self/fd/11

Když cat obdržela název souboru, přečetla za nás obsah souboru. Na druhou stranu nám echo právě ukázalo název souboru, že byl předán. Tento rozdíl bude patrnější, pokud přidáte další substituce:

$ cat <(date) <(date) <(date)
Thu Jul 21 12:44:45 EEST 2011
Thu Jul 21 12:44:45 EEST 2011
Thu Jul 21 12:44:45 EEST 2011

$ echo <(date) <(date) <(date)
/proc/self/fd/11 /proc/self/fd/12 /proc/self/fd/13

Je možné kombinovat substituci procesu (která generuje soubor) a přesměrování vstupu (které připojuje soubor k STDIN):

$ cat < <(date)
Thu Jul 21 12:46:22 EEST 2011

Vypadá to skoro stejně, ale tentokrát byl kočce předán stream STDIN místo názvu souboru. Můžete to vidět, když to zkusíte pomocí echo:

$ echo < <(date)
<blank>

Protože echo nečte STDIN a neprošel žádný argument, nic nedostaneme.

Potrubí a vstup přesměrovává obsah do streamu STDIN. Náhrada procesu spustí příkazy, uloží jejich výstup do speciálního dočasného souboru a poté předá tento název souboru místo příkazu. Jakýkoli příkaz, který používáte, jej považuje za název souboru. Všimněte si, že vytvořený soubor není běžný soubor, ale pojmenovaný kanál, který se automaticky odstraní, jakmile již není potřeba.

Související:Jsou filtrované události v Process Monitor uloženy v paměti nebo na disku?
Linux
  1. `^m` A jak se toho zbavit?

  2. Oprávnění a ukládání souborů?

  3. Přesměrování a výstup potrubí?

  1. Instalace a konfigurace vsFTPD

  2. Změnit datum vytvoření souboru

  3. Vlákna a deskriptory souborů

  1. unix - hlava A konec souboru

  2. Detekce smrti rodičovského procesu

  3. Bash - příkaz Datum a mezera