Processsubstitution

Inom datoranvändning är processersättning en form av kommunikation mellan processer som gör att inmatningen eller utmatningen av ett kommando visas som en fil. Kommandot ersätts in-line, där ett filnamn normalt skulle förekomma, med kommandoskalet . Detta gör att program som normalt bara accepterar filer kan läsa direkt från eller skriva till ett annat program.

Historia

Processersättning var tillgänglig som ett kompileringsalternativ för ksh88 , 1988 års version av KornShell från Bell Labs . rc - skalet tillhandahåller funktionen som "pipeline branching" i version 10 Unix , släppt 1990. Bash-skalet gav processersättning senast version 1.14, släppt 1994.

Exempel

Följande exempel använder KornShell-syntax.

Unix diff - kommandot accepterar normalt namnen på två filer som ska jämföras, eller ett filnamn och standardinmatning. Processsubstitution gör att man kan jämföra utdata från två program direkt:

 $  diff <  (  sortera fil1  )  <  (  sortera fil2  ) 

Uttrycket <(kommando) säger åt kommandotolkaren att köra kommandot och få dess utdata att visas som en fil. Kommandot kan vara vilket godtyckligt komplext skalkommando som helst .

Utan processersättning är alternativen:

  1. Spara utdata från kommandot/kommandona till en temporär fil och läs sedan den/de temporära filen/erna.
     $  sortera fil2 > /tmp/fil2.sorted  $  sortera fil1  |  diff - /tmp/fil2.sorted  $  rm /tmp/fil2.sorted 
  2. Skapa en namngiven pipe (även känd som en FIFO ), starta ett kommando med att skriva till det namngivna röret i bakgrunden, kör sedan det andra kommandot med det namngivna röret som indata.
    
     $  mkfifo /tmp/sort2.fifo  $  sort file2 > /tmp/sort2.fifo  &  $  sort file1  |  diff - /tmp/sort2.fifo  $  rm /tmp/sort2.fifo 

Båda alternativen är mer besvärliga.

Processersättning kan också användas för att fånga utdata som normalt skulle gå till en fil, och omdirigera den till ingången i en process. Bash-syntaxen för att skriva till en process är >(kommando) . Här är ett exempel med tee , wc och gzip som räknar raderna i en fil med wc -l och komprimerar den med gzip i en omgång:

 $  tee >  (  wc -l >  &  2  )  < bigfile  |  gzip > bigfile.gz 

Fördelar

De främsta fördelarna med processersättning jämfört med dess alternativ är:

  • Enkelhet : Kommandona kan ges in-line; det finns inget behov av att spara temporära filer eller skapa namngivna pipes först.
  • Prestanda : Att läsa direkt från en annan process är ofta snabbare än att behöva skriva en temporär fil till disken och sedan läsa in den igen. Detta sparar också diskutrymme.
  • Parallellism : Den ersatta processen kan köras samtidigt som kommandot läser dess utdata eller skriver dess input, och drar fördel av multiprocessing för att minska den totala tiden för beräkningen.

Mekanism

Under huven har processersättning två implementeringar. På system som stöder /dev/fd (de flesta Unix-liknande system) fungerar det genom att anropa pipe() systemanropet, vilket returnerar en filbeskrivning $fd för en ny anonym pipe, och sedan skapa strängen /dev/fd/$fd , och ersätter det på kommandoraden. På system utan /dev/fd- stöd anropar den mkfifo med ett nytt temporärt filnamn för att skapa en namngiven pipe, och ersätter detta filnamn på kommandoraden. För att illustrera de involverade stegen, överväg följande enkla kommandobyte på ett system med /dev/fd- stöd:

 $  diff fil1 <  (  sortera fil2  ) 

Stegen som skalet utför är:

  1. Skapa ett nytt anonymt rör. Denna pipe kommer att vara tillgänglig med något som /dev/fd/63 ; du kan se det med ett kommando som echo <(true) .
  2. Kör det ersatta kommandot i bakgrunden ( sortera fil2 i det här fallet) och skicka dess utdata till det anonyma röret.
  3. Utför det primära kommandot och ersätt det ersatta kommandot med sökvägen för det anonyma röret. I det här fallet kan det fullständiga kommandot expandera till något som diff file1 /dev/fd/63 .
  4. När exekveringen är klar, stäng det anonyma röret.

För namngivna rör skiljer sig utförandet enbart i skapandet och raderingen av röret; de skapas med mkfifo (som får ett nytt temporärt filnamn) och tas bort med unlink . Alla andra aspekter förblir desamma.

Begränsningar

De skapade "filerna" är inte sökbara , vilket innebär att processen att läsa eller skriva till filen inte kan utföra slumpmässig åtkomst ; den måste läsa eller skriva en gång från början till slut. Program som uttryckligen kontrollerar typen av en fil innan den öppnas kan vägra att arbeta med processersättning, eftersom "filen" som härrör från processersättning inte är en vanlig fil . Dessutom, fram till Bash 4.4 (släpptes i september 2016), var det inte möjligt att få utgångskoden för ett processersättningskommando från skalet som skapade processersättningen.

Se även

Vidare läsning