Suoritetaanko toiminnot aliprosesseina Bashissa?

Bash-Scripting Advanced -oppaassa , esimerkki 27-4 , seitsemäs rivi alhaalta, olen lukenut tämän:

Funktio toimii kuten aliprosessi.

Tein testin Bashissa, ja näyttää siltä, että yllä oleva lause on väärä.

Haut tämä sivusto, Bash Man, ja hakukoneeni eivät tuota mitään valoa.

Onko sinulla vastausta ja haluatko selittää sen?

Kommentit

  • Kuten on todettu, opas on äärimmäisen harhaanjohtava. Suosittelen sen sijaan Wooledge Bash Guide -opasta .
  • Tärkeä tosiasia on, että ” Bash ” välttää luomasta alikuoria. Ne ovat kalliita, niillä on oma ympäristö, ja ne vaikuttavat komentosarjan suorituskykyyn sekä tapaan, jolla koodi kulkee (monta kertaa epämiellyttävästi, jotta voidaan käsitellä niiden erityispiirteitä). Bashin todellinen tila on evoluution, koodin evoluution tulos. Tarkoitan, että Bashin ensimmäinen versio käyttää enemmän alikuoria *** kuin varsinainen. Tällainen epäjohdonmukaisuus näyttää olevan kohtuullista. *** jos haluat todistuksen, en voi ’ t antaa sinulle. Olen ’ veennyt sen verkkosivuilta, kommenteista … Olen lukenut kyseisen lausunnon joskus sitten. Id id = ”8e1ba7e7b1”>

.

vastaus

Advanced Bash-Scripting Guide ei ole aina luotettava, ja sen esimerkkiskriptit sisältävät vanhentuneita käytäntöjä, kuten käytännössä vanhentuneet backtickit komentojen korvaamista varten, ts. `command` eikä $(command).

Tässä tapauksessa se on räikeästi virheellinen.

Shell-toiminnot -kohde (kanonisessa) Bashissa käsikirjassa todetaan lopullisesti, että

Kuoritoiminnot suoritetaan nykyisessä kuoriyhteydessä; niiden tulkitsemiseksi ei luoda uutta prosessia.

Kommentit

  • ” Advanced Bash-Scripting Guide on yleensä epäluotettava ” Erittäin totta.
  • Voitteko antaa viitteitä tukemaan ensimmäinen lause?
  • @WillVousden miltä viite näyttäisi täällä? Joukko esimerkkejä oppaan ’ teknisistä puutteista? Asiakirja, jossa bash-yhteisön asiantuntijat ovat aiemmin todenneet, että se ei ole luotettava? Olisiko apua, jos pinonkuljettaja, jolla on kultamerkki bashissa, sopisi vain kommentissa? : p
  • @WillVousden En ’ usko, että haluamasi on olemassa luotettavassa muodossa. Mendel Cooper on päivittänyt ja korjannut oppaan ongelmat aiemmin, mutta ei ole julkista vikaseurantaa tai luetteloa virheistä. (Ehkä se on kaikkein tuomittavin lausunto, jonka voin tehdä.) Joten kun löydämme virheen (havaitun tai todellisen), voimme vain lähettää kirjoittajalle sähköpostia ja toivoa parasta.
  • @WillVousden, .. .Jos haluat historiaa siitä, kuinka kauan freenode #bash-kanavassa on vallinnut yksimielisyys siitä, että ABS: ää tulisi välttää, katso wooledge.org/ ~ greybot / meta / abs – jokaisen rivin toinen kenttä on aikaleima ja ensimmäinen on käyttäjänimi; Toivon ’ toivon, että väite siitä, että kyseessä olevat käyttäjätunnukset ovat hyvin arvostettuja yksilöitä, riittää.

Vastaa

Kihara-aaltosulkufunktiot suoritetaan kutsuvan kuoren prosessissa, paitsi jos he tarvitsevat omaa alikuortaan, joka on:

  • kun suoritat ne taustalla &
  • -sovelluksen kanssa, kun suoritat ne linkkinä putkilinjassa

Uudelleenohjaukset tai ylimääräiset env muuttujat eivät pakota uutta alikuorta:

hw(){ echo hello world from $BASHPID echo var=$var } var=42 hw >&2 echo $BASHPID #unexports var=42 and restores stdout here 

Jos määrität funktion sulkeilla curlien sijaan:

hw()( echo hello world from $BASHPID ) hw echo $BASHPID 

se toimii aina uudessa prosessissa.

Komennon korvaaminen $() luo myös prosessit aina bashissa (mutta ei ksh: ssä, jos sinulla on sisäänrakennettuja sisäänrakennuksia).

Kommentit

  • En tiennyt ’ tiennyt f() (...) on sallittu. Onko muita määritelmiä lukuun ottamatta {...} ja (...)? Bashissa I ’ en ole vielä muissa.
  • @tomas Voit käyttää function hw { echo hello world; } -syntaksia (ei tarvita () jos kirjoitat function ja voit määrittää uudelleenohjaukset heti lopullisten } tai ) kuten kohdassa hw(){ echo error; } >&2. Se ’ s siitä.
  • Tämä on vastaus, jonka ajattelin heti, ja se on aivan oikea.Se on äänestettävä oikeana vastauksena. f()(...) suorittaa aina oman kuoren, kun taas f(){...} ei.
  • NB bash -funktiot hyväksyvät kaikki komennot, joten foo() [[ x = x ]] on myös kelvollinen funktion määritelmä. Jos kuitenkin tarkastellaan funktiota, jolla on type foo, ’ huomaat, että tämä on edelleen syntaktinen sokeri kohteelle foo() { [[ x = x ]]; }. Sama koskee alikuorifunktioita: bar() ( : ) tulee bar() { ( : ); }.
  • @kojiro nice +1. didn ’ ei tiennyt, että

vastaus

kyseisen esimerkin kysymys näyttää tältä:

echo ${arrayZ[@]/%e/$(replacement)} 

Esimerkissä myöhemmin sanotaan:

# $( ... ) is command substitution. # A function runs as a sub-process. 

ABS-oppaalle hyväntekeväisyyden vuoksi heidän ilmeisesti tarkoitettiin kirjoittaa, että toiminto toimii komentokorvauksen sisällä ja komento-komennon sisällä oleva komento alikuoressa .

Kommentit

  • Se ’ on hyvin harhaanjohtavaa. Kiitos tulkinnastasi.
  • @tomas ” erittäin harhaanjohtava. ” Kyllä, erittäin. Toisin kuin ABS-opas, Greg ’ s Wiki on erinomainen lähde edistyneille bash-tiedoille.
  • Kippis. Mikä ’ on mielipiteesi tästä: wiki.bash-hackers.org/start ?
  • @tomas Minulla ei ole omakohtaista tietoa siitä.
  • @tomas, … oma mielipiteeni bash-hakkereiden wikistä on, että se ’ s erinomainen lähde. En ole ’ käynyt läpi sitä niin kattavasti kuin minulla on Wooledge-wiki, mutta se on yleensä tarkka ja kirjoitettu.

Vastaa

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