TCH (statz) | #1, Főfasz (10443) |
3355 | #4646 | ^ | Idézet | Fri, 06 Oct 2017 12:50:50 +02 |
94.21.*.* | *.pool.digikabel.hu |
Hát a shell-ekbe én nem másztam bele ennyire, így megnéztem mit csinál a bash és a zsh.function kecskefasz { if [ -e "anyad.txt" ]; then return ls fi return "kúúúúúúúúúúúúúúúúúrjunklovat" }(Mind a két shellben ugyanígy kell megírni.) Namármost, ezekben a shellekben visszaadni csak integert lehet (ráadásul logikailag negált értelemmel, értsd: a 0 igaz, minden más hamis), ha bármi mást (akár semmit se) adsz vissza, az 0-nak minősül, ill. a bash subshelles meghívás esetén, bereklamál, hogy azt nem lehet (illetve a semmit elfogadja, de az is 0 lesz). Ennek megfelelően a return-nek átadott ls stringként lesz lekezelve, ami 0 és ugyanez lesz a sorsa a másik ágon ülő "kúúúúúúúúúúúúúúúúúrjunklovat"-nak is. Azaz a függvény mindig 0 értékkel tér vissza. Tehát a fenti függvényt subshell-ként meghívva if ( kecskefasz ); then echo y else echo n fizsh-ban "y"-t ír ki a konzol, bash-ban pedig hibát. Ha pedig nem subshellként, hanem test meghívást adva hívod if [ kecskefasz ]; then echo y else echo n fiakkor mindig "y"-t ír ki a konzol. Ennek megfelelően az UNIX shellekben nem is lehet visszatérési értékként visszaadni egy könyvtárlistát. Amennyiben a második felírást nézzük: function kecskefasz { if [ -e "anyad.txt" ]; then ls return fi echo "kúúúúúúúúúúúúúúúúúrjunklovat" return }akkor ott, ha a test meghívással hívod a függvényt, akkor a végeredmény megegyezik az első függvény végeredményével, a subshelles megoldás esetén viszont az ls és az echo "kúúúúúúúúúúúúúúúúúrjunklovat" tartalma viszont a képernyőn fog landolni. Ennek megfelelően a végeredmény, azaz a képernyőre kiköpött tartalom az anyad.txt létezésének függvényében egy könyvtárlista vagy egy "kúúúúúúúúúúúúúúúúúrjunklovat" és utánuk egy y. Ezek szerint, ha az anyad.txt létezésének függvényében a könyvtárlistát szeretnéd visszakapni, vagy egy "kúúúúúúúúúúúúúúúúúrjunklovat" sztringet, akkor az így néz ki: eredmeny=$(kecskefasz)azaz ahogy Pety is mondta, el kell kapni a kimenetét azoknak a subshellből hívott parancsoknak. Mint mondtam, távol álljon tőlem a mikorofos bárminő védelme, de szerintem a felsoroltak miatt kár ekézni a PowerShell-t, úgy viselkedett, ahogy az elvárható volt egy shelltől. Szerintem a probléma abban gyökerezett, hogy te "sima" scriptnyelvként kezelted, holott ez egy shell scripting nyelv, és a shell scripting egy külön állatfaj a scripteken belül. Itt max annyit lehet a mikiszoft nyakába varrni, hogy ők összekeverték a kettőt (legalábbis az elmondásaid alapján) és a végeredmény finoman szólva sem lett logikus (legalábbis az elmondásaid alapján), de ettől még ha dokumentálva van, hogy mi miért történik, akkor max. a koncepciót lehet kritizálni, a működést nem nagyon...kivéve persze, ha bugos, ami mint tudjuk a jó öreg m$-nél nem ritka, de ez nem bug volt. :P Illetve még azt nem értem, hogy a fájl létezésének vizsgálata miért büfög vissza szövegesen egy true-t, de annak a parancsnak gondolom át lehet irányítani a kimenetét, hogy ne tegye. Vagy nem? |