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
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ä.
&
on haarukka, siellä ' ei ole execiä. Fork + exec on kun käynnistät ulkoisen komennon.exec
, mutta kahdella kielellä on erilainen ohjausvirta.&
käynnistää alikuoren, jossa annettu komento suoritetaan. Haarukka + exec. Voit ' t vain laittaa&
ilman edeltävää komentoa suoritettavaksi.