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 afunction
fájlt, és az átirányításokat közvetlenül a végső}
vagy)
minthw(){ 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 af(){...}
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 atype 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.