A funkciók alfolyamatként futnak a Bash-ban?

Részletes Bash-Scripting útmutatóban , példa 27-4 , 7. sor alulról, ezt olvastam:

A függvény részfolyamat.

Teszteltem a Bash-ban, és úgy tűnik, hogy a fenti állítás téves.

ez a webhely, a Bash Man, és a keresőmotorom nem hoz fényt.

Megvan a válasz, és meg szeretné magyarázni?

Megjegyzések

  • Amint megjegyeztük, ez az útmutató szélsőségesen félrevezető. Javaslom helyette a Wooledge Bash Guide alkalmazást.
  • Fontos tény, hogy " Bash " kerüli az alhéjak létrehozását. Ezek drágák, saját környezettel rendelkeznek, és ezek befolyásolják a szkript teljesítményét, valamint a kód áramlását (sokszor kényelmetlenül, sajátosságaik kezelése érdekében). A Bash tényleges állapota egy evolúció, egy kód evolúció eredménye. Úgy értem, hogy a Bash első verziója több alhéjat használ ***, mint a tényleges. Ez a fajta következetlenség ésszerűnek tűnik. *** ha igazolást akarsz, ' nem tudok neked megadni. ' weblapokból, megjegyzésekből származtattam … Valamikor valamikor olvastam valahol a nyilatkozatot.

Válasz

Az Advanced Bash-Scripting Guide nem mindig megbízható, és példaszkriptjei elavult gyakorlatokat tartalmaznak, például a gyakorlatilag elavult backticks a parancs behelyettesítésére, azaz `command`, nem pedig $(command).

Ebben a konkrét esetben egyértelműen helytelen.

A (kanonikus) Bash Héjfunkciók szakasza a kézikönyv határozottan kijelenti, hogy

A shell funkciókat az aktuális shell környezetben hajtják végre; nem hozható létre új folyamat ezek értelmezésére.

Megjegyzések

  • " Az Advanced Bash-Scripting Guide általában nem megbízható " Nagyon igaz.
  • Tudna-e referenciákat adni a első mondat?
  • @WillVousden hogyan nézne ki itt egy referencia? Egy csomó példa az útmutató ' technikai hiányosságaira? Egy dokumentum, ahol a bash közösség szakértői korábban megjegyezték, hogy megbízhatatlan? Segítene, ha egy stackoverflow tag, arany jelvénnyel a bash-ban, csak egyetértene egy megjegyzésben? : p
  • @WillVousden Nem gondolom, hogy maga a megbízható formában létezik az, amire vágyik. Mendel Cooper korábban frissítette és kijavította az útmutatóval kapcsolatos problémákat, de nincs nyilvános hibakövető vagy hibajegyzék. (Talán ez a legátkozóbb állítás, amelyet tehetek.) Tehát, ha hibát találunk (vélt vagy valós), akkor csak annyit tehetünk, hogy e-mailt küldünk a szerzőnek, és reméljük a legjobbat.
  • @WillVousden, .. .Ha előzményeket szeretne arról tudni, hogy a freenode #bash csatornában mennyi ideig volt konszenzus arról, hogy kerülni kell az ABS-t, lásd: wooledge.org/ ~ greybot / meta / abs – az egyes sorok második mezője az időbélyegző, az első pedig a felhasználónév; ' remélni fogom, hogy elegendő lesz az állítás, miszerint a szóban forgó felhasználónevek nagyon tisztelt egyének.

Válasz

A göndör zárójeles függvények a hívó shell folyamatban futnak, hacsak nincs szükségük saját alhéjukra:

  • amikor a háttérben futtatja őket &
  • ha egy csővezetékben linkként futtatja őket

Átirányítások vagy extra env. a változók nem fognak új alhéjat kényszeríteni:

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

Ha a függvényt curlies helyett zárójelekkel határozza meg:

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

mindig egy új folyamatban fog futni.

A parancs behelyettesítése $() szintén mindig a bash-ban hoz létre folyamatokat (de nem a ksh-ben, ha beépítetteket futtat benne).

Megjegyzések

  • Nem tudtam ' nem tudtam f() (...) megengedett. Van-e más definíció a {...} és (...) mellett? Bash-ban I ' m még nem szerepel másokban.
  • @tomas Használhatja a function hw { echo hello world; } szintaxist (nincs szükség () ha beírja a function fájlt, és az átirányításokat közvetlenül a végső } vagy ) mint hw(){ echo error; } >&2. Ez ' erről szól.
  • Ez a válasz, amin azonnal elgondolkodtam, és ez teljesen helyes.Meg kell szavazni, mint a helyes választ. A f()(...) mindig saját héjat hajt végre, míg a f(){...} nem.
  • Az NB bash függvények bármilyen összetett parancsot elfogadnak, tehát A foo() [[ x = x ]] szintén érvényes függvénydefiníció. Ha azonban a type foo paranccsal megnézzük a függvényt, akkor ' ll, hogy ez még mindig szintaktikus cukor a . Ugyanez vonatkozik az alhéj funkciókra is: bar() ( : ) bar() { ( : ); } lesz.
  • @kojiro nice +1. didn ' nem tudta, hogy

válasz

A parancs A példa kérdése így néz ki:

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

A példa később kimondja:

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

Mivel az ABS Guide karitatív jellegű, nyilvánvalóan azt akarták írni, hogy a függvény egy parancshelyettesítés ben fut, a parancscsere-helyettesítő parancs pedig alhéjban fut.

Megjegyzések

  • Ez ' nagyon félrevezető. Köszönjük értelmezését.
  • @tomas " nagyon félrevezető. " Igen, nagyon. Az ABS útmutatóval ellentétben a Greg ' s Wiki kiváló forrás a fejlett bash információkhoz.
  • Egészségére. Mi ' véleménye erről a véleményről: wiki.bash-hackers.org/start ?
  • @tomas Nincs közvetlen ismeretem erről.
  • @tomas, … saját véleményem a bash-hackerek wiki kapcsán az, hogy ' s kiváló forrás. ' még nem éltem át olyan átfogóan, mint a Wooledge wiki, de általában pontos és pontosan megírt.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük