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 kirjoitatfunction
ja voit määrittää uudelleenohjaukset heti lopullisten}
tai)
kuten kohdassahw(){ 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 taasf(){...}
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 ontype foo
, ’ huomaat, että tämä on edelleen syntaktinen sokeri kohteellefoo() { [[ x = x ]]; }
. Sama koskee alikuorifunktioita:bar() ( : )
tuleebar() { ( : ); }
. - @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.