Understøtter bash gaffel svarende til C ' s gaffel ()?

Jeg har et script, som jeg gerne vil forkaste på et tidspunkt, så to kopier af det samme script kører.

For eksempel , Vil jeg gerne have, at følgende bash-script eksisterer:

echo $$ do_fork() echo $$ 

Hvis dette bash-script virkelig eksisterede, ville den forventede output være:

<ProcessA PID> <ProcessB PID> <ProcessA PID> 

eller

<ProcessA PID> <ProcessA PID> <ProcessB PID> 

Er der noget, jeg kan placere i stedet for “do_fork ()” for at få dette slags output, eller for at få bash-scriptet til at lave en C-lignende gaffel?

Svar

Ja. Forking er stavet &:

echo child & echo parent 

Hvad der kan forvirre dig er, at $$ er ikke PID for shell-processen, det er PID for original shell-processen. Pointen med at gøre det på denne måde er, at $$ er en unik identifikator for en bestemt forekomst af shell-scriptet: det ændrer sig ikke under scriptets udførelse, og det adskiller sig fra $$ i enhver anden, der kører samtidigt manuskript. En måde at få shell-processen “s faktiske PID på er sh -c "echo $PPID".

Kontrolstrømmen i skallen er ikke den samme som C. Hvis i C dig “d skriv

first(); fork(); second(); third(); 

så er en skalækvivalent

after_fork () { second; third; } first; after_fork & after_fork 

Den enkle skalform first; child & parent svarer til det sædvanlige C-idiom

first(); if (fork()) parent(); else child(); 

& $$ eksisterer og opfører sig på denne måde i hver Bourne-stil shell og i (t) csh. $PPID eksisterede ikke i den oprindelige Bourne skal men er i POSIX (så det er i aske, bash, ksh, zsh, …).

Kommentarer

  • Men det ' s grundlæggende " gaffel + exec ", ikke bare gaffel.
  • @mattdm: Uh? & er fork, der er ' ingen eksekvering involveret. Gaffel + exec er, når du starter en ekstern kommando.
  • @mattdm: Ah, jeg tror jeg kan se hvad Cory kommer til. Der ' er ingen exec, men de to sprog har forskellige kontrolflow.
  • @Gilles: Bash kontroloperator & starter en subshell, hvor den givne kommando udføres. Gaffel + udførelse Du kan ' t bare sætte & uden nogen foregående kommando til at udføre.
  • Nå, hvis " Forking er stavet & " var en ægte erklæring, du kan sætte & på en linje i sig selv. Men du kan ' t. Det betyder ikke ' t " fork her ". Det betyder " udfør den foregående kommando i baggrunden i en subshell ".

Svar

Ja, det hedder subshells . Shell-kode inden for parentes køres som en subshell (fork). Men den første skal venter normalt på, at barnet skal gennemføres. Du kan gøre det asynkront ved hjælp af & terminatoren. Se det i aktion med noget som dette:

#!/bin/bash (sleep 2; echo "subsh 1")& echo "topsh" 

$ bash subsh.sh

Kommentarer

  • Parenteserne opretter en subshell , men at ' s gaffel + vent. & er gaffel alene. Hvis du vil udføre mere end en pipeline i barneprocessen, det ' er nok til at bruge seler (som udfører gruppering uden at oprette en underordnet proces): { sleep 2; echo child; } &

Svar

Der er ingen indfødte bash (eller efter min viden enhver anden typisk * nix shell) måde at gøre dette på. Der er mange måder at gyde forked processer, der gør noget andet asynkront, men jeg tror ikke, der er noget, der følger den nøjagtige semantik i fork () systemopkaldet.

Den typiske tilgang ville være at få dit topniveau-script til at give hjælpere, der udfører det arbejde, du vil opdele. Hvis du $0 $@ & eller hvad som helst, starter du i starten igen og har brug for finde ud af det på en eller anden måde.

Jeg begynder faktisk at tænke på flere smarte måder, hvorpå man måske gør netop det ….

Men , før min hjerne bliver for båret af det, synes jeg en ret god regel er: hvis du prøver at skrive noget i skal, og det bliver fuld af smarte tricks, og du ønsker flere sprogfunktioner, tid til at skifte til et rigtigt programmeringssprog .

Kommentarer

  • Selvom dit punkt er godt taget – bash ' s syntaks er uden tvivl vanskelig og det ' mangler de mere elegante datastrukturer og funktioner i Perl eller Python, bash er så reel, som det bliver – i sit domæne . Det er et domænespecifikt sprog, og jeg vil argumentere endnu bedre (mere kortfattet, enklere) end f.eks. Python i mange tilfælde. Kan du administrere et rumfyldt system og ikke kende Python? Ja. Kan du gøre det og ikke kende en slik af bash [programmering]? Jeg vil ' ikke prøve. Efter 30 års shell-programmering fortæller jeg dig, at det ' er så ægte som det bliver. Og ja, jeg taler Python. Men lad ikke ' ikke forvirre de unge.
  • Når det er sagt, teknisk set kan jeg lide dette svar mere. At sige, at " & " er svaret til brugeren ' s spørgsmål, " fork på et tidspunkt, så to kopier af det samme script kører " er for mig sindet forvirrende. Hvad " & " ifølge bash-manualen er " … udfører kommandoen [given] i baggrunden i en subshell. " Den skal afslutte en kommando, og den involverer en fork (teknisk , i Linux, en klon ()), men på det tidspunkt kører to kopier af det samme script ikke.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *