Tukeeko bash haarukointia, joka on samanlainen kuin C ' s haarukka ()?

Minulla on komentosarja, jonka haluaisin haarautua yhdessä vaiheessa, joten kaksi kopiota samasta käsikirjoituksesta on käynnissä.

Esimerkiksi , Haluaisin seuraavan bash-komentosarjan olemassaolon:

echo $$ do_fork() echo $$ 

Jos tämä bash-komentosarja olisi todella olemassa, odotettu lähtö olisi:

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

tai

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

Onko jotain mitä voin laittaa ”do_fork ()”: n tilalle saadaksesi tämän sellainen lähtö tai saada bash-komentosarja tekemään C-tyyppinen haarukka?

Vastaa

Kyllä. Haarukka on kirjoitettu &:

echo child & echo parent 

Sinua voi hämmentää se, että $$ ei ole shell-prosessin PID, se on alkuperäinen shell-prosessin PID. Tämän tekemisen tarkoitus on, että $$ on shell-komentosarjan tietyn esiintymän yksilöllinen tunniste: se ei muutu komentosarjan suorituksen aikana ja se eroaa $$ -ominaisuudesta muissa samanaikaisesti käynnissä olevissa käsikirjoitus. Yksi tapa saada shell-prosessin todellinen PID on sh -c "echo $PPID".

Kuoren ohjausvirta ei ole sama kuin C. Jos kohdassa C ”d kirjoita

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

silloin kuorivastaava on

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

Yksinkertainen kuorimuoto first; child & parent vastaa tavallista C-idioomia

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

& ja $$ on olemassa ja käyttäytyy tällä tavoin jokaisessa Bourne-tyylisessä kuoressa ja kohdassa (t) csh. $PPID ei ollut ornaalisessa Bournessa. shellissä, mutta on POSIX-järjestelmässä (joten se on tuhkassa, bash, ksh, zsh,…).

Kommentit

  • Mutta ' s pohjimmiltaan " haarukka + exec ", ei vain haarukka.
  • @mattdm: Uh? & on haarukka, siellä ' ei ole execiä. Fork + exec on kun käynnistät ulkoisen komennon.
  • @mattdm: Ah, luulen, että näen mitä Cory on tulossa. Siellä ' ei ole exec, mutta kahdella kielellä on erilainen ohjausvirta.
  • @Gilles: The bash ohjausoperaattori & käynnistää alikuoren, jossa annettu komento suoritetaan. Haarukka + exec. Voit ' t vain laittaa & ilman edeltävää komentoa suoritettavaksi.
  • No, jos " haarukka on kirjoitettu >

linjalla itsestään. Mutta voit ' t. Se ei tarkoita ' t " haarukkaa ". Se tarkoittaa, että " suorita edellinen komento taustalla alikuoressa ".

Vastaa

Kyllä, sitä kutsutaan alisarakkeiksi . Suluissa oleva simpukakoodi suoritetaan subshell (haarukka). Ensimmäinen kuori kuitenkin yleensä odottaa lapsen täydentymistä. Voit tehdä siitä asynkronisen & -terminaattorin avulla. Katso se toiminnassa jotain tällaista:

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

$ bash subsh.sh

Kommentit

  • Suluissa luodaan alikuori , mutta se ' s haarukka + odota. & on vain haarukka. Jos haluat suorittaa useamman kuin yhden putken aliprosessissa, se ' riittää käyttämään aaltosulkeita (jotka suorittavat ryhmittelyn luomatta aliprosessia): { sleep 2; echo child; } &

Vastaa

Ei ole alkuperäiskansoja bash (tai tietoni mukaan mikä tahansa muu tyypillinen * nix-kuori) tapa tehdä tämä. On olemassa monia tapoja kutoa haarautuneita prosesseja, jotka tekevät jotain muuta asynkronisesti, mutta en usko, että on mitään, joka noudattaa haarukan () järjestelmäkutsun tarkkaa semantiikkaa.

Tyypillinen lähestymistapa olisi Pyydä ylätason komentosarjaasi kutomaan avustajia, jotka tekevät vain haluamasi työn. Jos teet $0 $@ & tai mitä tahansa, aloitat alusta uudelleen ja sinun on selvitä se jotenkin.

Olen itse asiassa alkamassa miettiä useita fiksuja tapoja, joilla voisi tehdä juuri niin.

Mutta , mielestäni ennen kuin aivoni liikuttuvat siihen, mielestäni melko hyvä sääntö on: jos yrität kirjoittaa jotain kuoressa ja se saa täynnä fiksuja temppuja ja haluat lisää kieliominaisuuksia, aika siirtyä oikeaan ohjelmointikieleen .

kommentit

  • Vaikka mielipiteesi otettaisiin hyvin huomioon – bash ' n syntakse on kiistatta vaikeaa ja se on ' puuttuu Perlin tai Pythonin tyylikkäimmistä tietorakenteista ja ominaisuuksista, bash on yhtä todellinen kuin se saa- toimialueellaan . Se on toimialakohtainen kieli, ja väittäisin, että monissa tapauksissa jopa parempi (ytimekkäämpi, yksinkertaisempi) kuin esimerkiksi Python. Pystytkö hallitsemaan huonehuoneen järjestelmiä etkä tiedä Pythonia? Joo. Voitko tehdä sen etkä tiedä nuolla bash [ohjelmointi]? En halua ' halua kokeilla. 30 vuoden shell-ohjelmoinnin jälkeen kerron sen ' s niin todelliseksi kuin se saa. Ja kyllä, puhun Pythonia. Mutta älä sekoita nuoria.
  • Siitä huolimatta pidän tästä vastauksesta enemmän teknisesti. Sanoa, että " & " on vastaus käyttäjälle ' s kysymys, " haarukka yhdessä vaiheessa, joten kaksi saman komentosarjan kopiota on käynnissä " on minun mieli sekava. Mitä " & " tekee, bashin käsikirjan mukaan, on " … suorittaa [annettu] -komennon alikuoren taustalla. " Sen on lopetettava komento, ja siihen liittyy haarukka (teknisesti , Linuxissa klooni ()), mutta siinä vaiheessa kaksi kopiota samasta käsikirjoituksesta ei ole käynnissä.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *