kemi (statz) | #2, Főfasz (2970) |
598 | #4642 | ^ | Idézet | Thu, 05 Oct 2017 22:10:08 +02 |
134.255.*.* | *.dsl.pool.telekom.hu |
Mi ez? Mondtam már, hogy imádom a póvershellt? Szerintetek ez mit ad vissza? function kecskefasz { if ([File]::Exists("anyad.txt")) { return dir } return "kúúúúúúúúúúúúúúúúúrjunklovat" } Ne olvasd tovább, inkább írd meg kommentben. :D Természetesen, ha az if igaz, visszaad egy "True"-t, meg a dir listát egy tömbben, ellenkező esetben simán egy sztringet, vagyis visszaad mindent, amit kiértékelt, és 0 exit kóddal tért vissza, egy tömbben. Logikus nem? Minden szkriptnyelv így működik. Egy egész napomba telt mire kidebuggoltam, aztán utánaolvastam. |
TCH (statz) | #1, Főfasz (10443) |
1273 | #4643 | ^ | Idézet | Thu, 05 Oct 2017 23:00:49 +02 |
94.21.*.* | *.pool.digikabel.hu |
Lényegében arról van szó, hogy van egy nagy területed, benne egy kis területtel. Ha a nagy területet átméretezed/elmozgatod, a kicsin is végre kell hajtani ezt és ez a függvény megmondja a kis terület új paramétereit. Bevallom én ezt nem értem. Az odáig érthető, hogy amennyiben létezik az anyad.txt, akkor visszaadja a dir eredményét soronként szétdobva egy tömbbe, ha meg nem, akkor meg azt, hogy kúúúúúúúúúúúúúúúúúrjunklovat, de mi az, hogy ha létezik, akkor true-t ad vissza pluszba, ha meg nem, akkor meg 0-t? Magyarán ez mindig egy tömböt ad vissza, ahol az egyik elem az vagy true vagy 0, a másik meg amit ténylegesen visszaadtál? Távol álljon tőlem a mikorfos bárminő védelme, de ha kapásból utánaolvasol, akkor lehet nem kell egy napot debuggolnod. |
kemi (statz) | #2, Főfasz (2970) |
819 | #4644 | ^ | Idézet | Fri, 06 Oct 2017 07:01:56 +02 |
134.255.*.* | *.dsl.pool.telekom.hu |
Nem, mert bele fogja dobni a true-t a dir lista elé, mert a [File]::Exists("anyad.txt") kiértékelés volt, és 0 exit kóddal tért vissza. Erre nem is találtam jobb megoldást, minthogy ki kell venni az utolsó elemet a return value-ból. Gyakorlatilag tök mindegy mi van a return után. Akár így is írhattam volna: function kecskefasz { if ([File]::Exists("anyad.txt")) { dir return } Write-Output "kúúúúúúúúúúúúúúúúúrjunklovat" return }Mert nem azt az értéket adja vissza ami a return után van, hanem minden sikeres kiértékelést beledob egy tömbbe, és visszaadja. |
djpety alias "Pety" | #6, Lófasz (953) |
1048 | #4645 | ^ | Idézet | Fri, 06 Oct 2017 09:39:53 +02 |
188.143.*.* | *.pool.digikabel.hu |
Hát akkor ez olyan, mintha PHP-ban ezt csinálod: function x_dir(){ return print_r(scandir(getcwd())); // PS-ben valami ilyesmit jelenthet a dir } var_dump(x_dir()); PS esetében gondolom visszatér egy tömbkiírással a dir (mint itt PHP-ban az x_dir()) a return pedig visszatér a függvény visszatérési értékével (true). Ez a természetes viselkedése, doksiban biztos leírják. Olyan nincs, hogy egy nyelvnek hasonlítania kell egy másikra. Az mondjuk lehet, teljesen logikátlan, vagy körülményesen van kialakítva. Mivel a PowerShell alapvetően egy shell, így shellként is működik. Bash-ben is hasonlót érsz el, ha a scripteben az van, hogy ls. A kimenetét el kell kapnod, hogy ne írja ki és dolgozz vele. Return után meg jó hogy mindegy mi van, hiszen visszatér. A shelleknél egy function inkább subshellként működik, tehát nem teljesen szokványos függvények. |
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? |
djpety alias "Pety" | #6, Lófasz (953) |
455 | #4647 | ^ | Idézet | Fri, 06 Oct 2017 13:06:10 +02 |
188.143.*.* | *.pool.digikabel.hu |
Szerintem ez sikerességet jelöl csak. Képzeljük el azt a helyzetet, ha a fájl nem létezik (false), vagy nincsen jogosultság elérni. Az meg a shell viselkedése lehet, hogy visszatérési értéket lefordít stringre és kiírja. |
TCH (statz) | #1, Főfasz (10443) |
196 | #4648 | ^ | Idézet | Fri, 06 Oct 2017 13:49:15 +02 |
94.21.*.* | *.pool.digikabel.hu |
Jó, csak egy vizsgálat eredményének az értékét nem szokás kiokádni az outputra. https://nakedsecurity.sophos.com/2016/06/20/ransomware-thats-100-pure-javascript-no-download-required/ |