abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 05:11 | Komunita

    #HACKUJBRNO 2024, byly zveřejněny výsledky a výstupy hackathonu města Brna nad otevřenými městskými daty, který se konal 13. a 14. dubna 2024.

    Ladislav Hagara | Komentářů: 0
    včera 17:55 | IT novinky

    Společnost Volla Systeme stojící za telefony Volla spustila na Kickstarteru kampaň na podporu tabletu Volla Tablet s Volla OS nebo Ubuntu Touch.

    Ladislav Hagara | Komentářů: 3
    včera 17:44 | IT novinky

    Společnost Boston Dynamics oznámila, že humanoidní hydraulický robot HD Atlas šel do důchodu (YouTube). Nastupuje nová vylepšená elektrická varianta (YouTube).

    Ladislav Hagara | Komentářů: 0
    včera 15:11 | Nová verze

    Desktopové prostředí LXQt (Lightweight Qt Desktop Environment, Wikipedie) vzniklé sloučením projektů Razor-qt a LXDE bylo vydáno ve verzi 2.0.0. Přehled novinek v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 1
    včera 14:22 | IT novinky

    Nejvyšší soud podpořil novináře Českého rozhlasu. Nařídil otevřít spor o uchovávání údajů o komunikaci (data retention). Uvedl, že stát odpovídá za porušení práva EU, pokud neprovede řádnou transpozici příslušné směrnice do vnitrostátního práva.

    Ladislav Hagara | Komentářů: 0
    včera 05:33 | Zajímavý článek

    Minulý týden proběhl u CZ.NIC veřejný test aukcí domén. Včera bylo publikováno vyhodnocení a hlavní výstupy tohoto testu.

    Ladislav Hagara | Komentářů: 22
    včera 04:44 | Nová verze

    Byla vydána nová verze 3.5.0 svobodné implementace protokolu RDP (Remote Desktop Protocol) a RDP klienta FreeRDP. Přehled novinek v ChangeLogu. Opraveno bylo 6 bezpečnostních chyb (CVE-2024-32039, CVE-2024-32040, CVE-2024-32041, CVE-2024-32458, CVE-2024-32459 a CVE-2024-32460).

    Ladislav Hagara | Komentářů: 0
    včera 04:11 | Nová verze

    Google Chrome 124 byl prohlášen za stabilní. Nejnovější stabilní verze 124.0.6367.60 přináší řadu oprav a vylepšení (YouTube). Podrobný přehled v poznámkách k vydání. Opraveno bylo 22 bezpečnostních chyb. Vylepšeny byly také nástroje pro vývojáře.

    Ladislav Hagara | Komentářů: 0
    včera 02:22 | Nová verze

    Byla vydána nová verze 9.3 z Debianu vycházející linuxové distribuce DietPi pro (nejenom) jednodeskové počítače. Přehled novinek v poznámkách k vydání. Novinkou je vlastní repozitář DietPi APT.

    Ladislav Hagara | Komentářů: 0
    16.4. 18:44 | Nová verze

    Byl vydán Mozilla Firefox 125.0.1, první verze z nové řady 125. Přehled novinek v poznámkách k vydání, poznámkách k vydání pro firmy a na stránce věnované vývojářům. Vypíchnout lze podporu kodeku AV1 v Encrypted Media Extensions (EME). Řešeny jsou rovněž bezpečnostní chyby. Nový Firefox 125.0.1 je již k dispozici také na Flathubu a Snapcraftu.

    Ladislav Hagara | Komentářů: 0
    KDE Plasma 6
     (66%)
     (11%)
     (2%)
     (21%)
    Celkem 516 hlasů
     Komentářů: 4, poslední 6.4. 15:51
    Rozcestník

    Shellová zábava

    10.1.2018 17:55 | Přečteno: 1489× | poslední úprava: 10.1.2018 23:10

    Dnes jsem narazil na zajímavé chování shellu, o které bych se rád podělil. Co myslíte, že vypíše tento skript?
    #!/bin/sh
    
    f() {
            echo value is $V
    }
    
    f
    V=1 f
    f
    
    Pokud jej spustíme v bashi, třeba pomocí "bash ./demo.sh", tak dostaneme
    value is
    value is 1
    value is
    
    což je tak nějak, co by člověk očekával. Pokud jej spustíme v dashi, dostaneme
    value is
    value is 1
    value is 1
    

    Budiž, po troše hledání člověk nalezne, že POSIX chování nejspíš nespecifikuje, takže skript se na konkrétní chování nesmí spoléhat.

    To nejlepší nakonec. Pokud máte /bin/sh jako bash a ne jako dash, je rozdíl v chování "sh demo.sh" a "bash demo.sh", přestože se pokaždé spouští bash.

    EDIT: Link na relevantní diskuzi v mailing listu dashe.

           

    Hodnocení: 100 %

            špatnédobré        

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    Max avatar 10.1.2018 19:35 Max | skóre: 72 | blog: Max_Devaine
    Rozbalit Rozbalit vše Re: Shellová zábava
    Tak o dashi se ví, že toho moc neumí a není na takové úrovni jako bash. Ostatně to myslím nebyl ani jeho záměr.
    Každopádně, jaký smysl má zápis "V=1 f" kromě testování syntaxe různých interpretů?

    Jinak odpověď na to, proč symlink "/bin/sh -> /bin/bash" dává jiný výsledek, najdeš v manpage, cituji :

    "If bash is invoked with the name sh, it tries to mimic the startup behavior of historical versions of sh as closely as possible, while conforming to the POSIX standard as well."

    Zdar Max
    Měl jsem sen ... :(
    10.1.2018 20:04 Marcel Šebek | skóre: 21 | blog: c
    Rozbalit Rozbalit vše Re: Shellová zábava
    Hm, zajímavý, tušil jsem, že bash se o něco takového bude pokoušet, ale man jsem důkladně nepročítal.

    Jen tak mimochodem, na problém jsem paradoxně přišel tím, že skript mi nefungoval v bashi, ale v dashi fungoval.
    Real programmers don't comment their code. If it was hard to write, it should be hard to read.
    10.1.2018 20:06 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Shellová zábava
    Ten dash se takhle podivně chová i v případě, že je tam místo funkce normální (ne builtin) příkaz?
    10.1.2018 23:03 Marcel Šebek | skóre: 21 | blog: c
    Rozbalit Rozbalit vše Re: Shellová zábava
    Ne, pro příkaz (builtin se dash chová normálně, jen pro funkci to ponechá hodnotu nastavenou. Problém je, že ze syntaxe není vždy na první pohled jasné, zda jde o funkci nebo o příkaz.
    Real programmers don't comment their code. If it was hard to write, it should be hard to read.
    10.1.2018 21:24 Odin
    Rozbalit Rozbalit vše Re: Shellová zábava
    Jak jste sam napsal, problem to neni. Proste to nepouzivejte a muzete v klidu spat.
    skunkOS avatar 11.1.2018 11:19 skunkOS | skóre: 27 | blog: Tak nějak
    Rozbalit Rozbalit vše Re: Shellová zábava
    Přesně toto je popsáno i v Advanced Bash Scripting Guide, který je imho perfektní pro naučení Bashe.
    http://martinrotter.github.io
    10.1.2018 20:04 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Shellová zábava
    Každopádně, jaký smysl má zápis "V=1 f" kromě testování syntaxe různých interpretů?

    Hodně často se to používá např. v konstrukcích typu

      ... | LC_COLLATE=C sort
    

    Obecně v situaci, kdy potřebujete spustit konkrétní příkaz s určitou hodnotou určité proměnné, ale nechcete ji nastavovat (jako exportovanou) v environmentu shellu, okdud by ji zdědily i všechny ostatní příkazy.

    To chování dashe (jestli se tak opravdu chová a nebyla to nějaká jiná chyba) je hodně nešťastné a obávám se, že to rozbije hodně skriptů.

    11.1.2018 03:24 pc2005 | skóre: 38 | blog: GardenOfEdenConfiguration | liberec
    Rozbalit Rozbalit vše Re: Shellová zábava
    +1 Jo už jsem to chtěl taky napsat.

    Já teda nejčastěji používám LD_LIBRARY_PATH="něco" program. Třeba ve steamu je to všude.

    btw Ještě u toho sortu by mohl být rozdíl mezi funkcí bashe a externím programem, ale stejné chování u obou je prostě logické.
    11.1.2018 11:11 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Shellová zábava
    Každopádně, jaký smysl má zápis "V=1 f" kromě testování syntaxe různých interpretů?
    Tenhle zápis mi přijde jako naprosto běžná věc, například CC=/nekde/nejaky/cc make . Něbo máš na mysli specificky při používání shellových funkcí (ie. ne programů)? V takovém případě to je, pravda, asi trochu neobvyklé...
    Max avatar 11.1.2018 14:26 Max | skóre: 72 | blog: Max_Devaine
    Rozbalit Rozbalit vše Re: Shellová zábava
    Ano, myslel jsem v případě použití shellové fce, ale ono to smysl dává, jen to nevídám, tak mi to přišlo divný.
    Zdar Max
    Měl jsem sen ... :(
    10.1.2018 21:10 snajpa | skóre: 20 | blog: snajpuv_blocek | Brno
    Rozbalit Rozbalit vše Re: Shellová zábava
    Jsem jediny, kteremu v kontextu poslednich udalosti mrazi v zadech pri cteni "narazil jsem na podivne chovani..."? :-D
    --- vpsFree.cz --- Virtuální servery svobodně
    10.1.2018 22:13 mimi.vx | skóre: 37 | blog: Mimi.VX | Praha
    Rozbalit Rozbalit vše Re: Shellová zábava

    j,

     

    na vetsinu poslednich veci se neprislo nahodou ale celkem dost usilovnou praci velmi dobre placenych lidi

    USE="-gnome -kde";turris
    10.1.2018 23:12 marbu | skóre: 31 | blog: hromada | Brno
    Rozbalit Rozbalit vše Re: Shellová zábava
    Ne :)
    There is no point in being so cool in a cold world.
    10.1.2018 21:22 Odin
    Rozbalit Rozbalit vše Re: Shellová zábava
    Ehm a co je divneho na tom, ze si to kazdy shell implementuje po svem, kdyz, jak jste si ostatne sam dohledal, standard toto chovani nedefinuje? Myslim, ze to snad ani nestoji za ten blogpost. Ono vubec obecne pouzivat globalni promenne neni dobry napad a to nikdy a v zadnem normalnim jazyku.
    10.1.2018 22:01 mimi.vx | skóre: 37 | blog: Mimi.VX | Praha
    Rozbalit Rozbalit vše Re: Shellová zábava

    a v tomto pripade se jedna ciste jen o  lokalni definici promene pro konkretni volani funkce f bez zasahu do env..

    takze bash se narozdil od dashe chova logicky

    USE="-gnome -kde";turris
    10.1.2018 22:48 Odin
    Rozbalit Rozbalit vše Re: Shellová zábava
    Jiste, chovani bashe je v tomto asi lepsi, ale to nic nemeni na tom, ze jine shelly to implementuji po svem a nelze to oznacit za spatnou implementaci. Proste neni v 99 procentech pripadu dobry napad toto pouzit.
    15.1.2018 09:29 mimi.vx | skóre: 37 | blog: Mimi.VX | Praha
    Rozbalit Rozbalit vše Re: Shellová zábava

    jj, bud clovek musipsat dle posixu a davat si pozor na nedefinovane veci. A nebo proesne specifikovat shell/jazyk

    USE="-gnome -kde";turris
    xkucf03 avatar 10.1.2018 23:25 xkucf03 | skóre: 49 | blog: xkucf03
    Rozbalit Rozbalit vše Re: Shellová zábava
    co je divneho na tom, ze si to kazdy shell implementuje po svem
    Smyslem konstrukce:
    PROMĚNNÁ=hodnota nějaký-příkaz;
    je spustit nějaký-příkaz s danou hodnotou proměnné prostředí – zatímco jiné/následující příkazy chci spouštět bez této proměnné resp. s její původní hodnotou – jinak bych totiž napsal:
    PROMĚNNÁ=hodnota;
    
    nějaký-příkaz;
    nějaký-další-příkaz;
    Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
    11.1.2018 00:20 RM
    Rozbalit Rozbalit vše Re: Shellová zábava
    Tak on příkaz přiřazení 'PROMĚNNÁ=hodnota' má tu vlastnost, že má navíc platný oddělovač mezeru. Nejedná se o plnohodnotný oddělovač jako středník nebo nový řádek, protože přiřazení na takovém řádku se provedou stejně až po ; nebo \n. Takže něco jako V=1 M=2 echo $V$M sice funguje, ale nic nevytiskne. U "funkce" (ono je to spíš makro) je situace jiná. Ta při vložení kódu na místo přidá hned řádný oddělovač, proměnné se tedy nastaví a echo uvnitř funkce má už k dispozici nastavené proměnné ze stejného řádku. Z toho pohledu je logické chování dashe. Fíčura bashe toho využívá jako levého argumentu a snaží se chování připodobnit chování externího programu. -- Je to prostě taková hezká bashovina, co nestojí za hádku.
    11.1.2018 07:01 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Shellová zábava

    Mně tedy chování dashe vůbec logické nepřipadá, protože hlavně vůbec není konzistentní. V okamžiku, kdy se konstrukce

      var=val cmd
    

    chová diametrálně odlišně podle toho, jestli je cmd (externí) příkaz nebo funkce, stačí nahradit příkaz vlastním wrapperem (což je běžný postup) a skript se rozbije. Tohle prostě autoři dashe nedomysleli.

    "funkce" (ono je to spíš makro)

    Shellová funkce se ani zdaleka nechová jako makro.

    11.1.2018 09:33 RM
    Rozbalit Rozbalit vše Re: Shellová zábava
    není konzistentní

    Ono být ani konzistentní nemůže, když externí programy a built-in, které je překrývají, podporují levý argument a jiné built-in programy argument na levé straně nepodporují. (S tím echem jsem neuvedl moc dobrý příklad, to se zrovna překrývá s externím programem echo a u těch co levou stranou nepodporují hlásí shell chybu, kromě samotného přiřazení.)

    nahradit příkaz vlastním wrapperem

    Já nevim, jestli bych chtěl měnit změnou parametru prostředí před funkcí chování všech programů použitých uvnitř wrapperu. Zejména, když u některých ani nevím, co by to mohlo způsobit. Navíc hojné používání levého argumentu mi moc čitelné nepřijde; raději, když to funkce nepodporují.

    Shellová funkce se ani zdaleka nechová jako makro

    Vycházím z toho, že je to skoro stejné jako makro TeXu (až na expanze): žádné lexikální prostory - jen localizace proměnné uvnitř bloku; výstupem je tisk na stdout (pokud nepoužívám return pro status do stderr); takže pokud bych ve funkci nahradil poziční parametry hodnotou, tak to celé mohu napsat jen do bloku spuštěném v externím procesu třeba jako (makro.....) | cat nebo u přiřazení se blok vloží do substituce m=$(makro....). Mně to tedy vždycky přišlo tak trochu na pomezí makro/funkce, ale představa makra mi přijde u řešení některých problémů výhodnější. Nevím sice jak to je uvnitř shellu naprogramované, ale pochybuji, že "funkce" skutečně proběhne mimo program a pak vrací jen výsledek; nehledě na to, že to ani návratovou hodnotu nemá. Kdyby to tak bylo, pak by se to zřejmě nenazýváno makro-procesorem. Ale zkuste mne přesvědčit o opaku, rád si v tom případně udělám jasno.
    11.1.2018 09:53 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Shellová zábava
    podporují levý argument a jiné built-in programy argument na levé straně nepodporují

    Tak tady se nechytám. Co myslíte termínem levý argument?

    Já nevim, jestli bych chtěl měnit změnou parametru prostředí před funkcí chování všech programů použitých uvnitř wrapperu.

    Já samozřejmě ano. Když to bude samostatný script, také tu proměnnou dostane do svého environmentu. A funkce je v podstatě takový "embedded script", tedy až na to, že defaultně sdílí environment se zbytkem scriptu.

    nehledě na to, že to ani návratovou hodnotu nemá

    Opravdu? Tak zkuste spustit tohle

    #!/bin/bash
    
    function starts_with_a()
    {
        if [ "${1#a}" = "$1" ]; then
            return 1
        else
            return 0
        fi
    }
    
    starts_with_a abc && echo "abc YES"
    starts_with_a abc || echo "abc NO"
    starts_with_a def && echo "def YES"
    starts_with_a def || echo "def NO"
    

    a vysvětlit, proč to vypíše

    abc YES
    def NO
    
    11.1.2018 10:37 RM
    Rozbalit Rozbalit vše Re: Shellová zábava
    Co myslíte termínem levý argument?

    Samozřejmě to, co je uvedeno na levé straně příkazu/programu. Nejčastěji nastavení hodnot prostředí LC_TYPE aj., ale v podstatě tam může být cokoliv, co program podporuje, třeba nastavení vlastních proměnných při spuštění shellu; asi je vám jasné, že se nejedná o příkaz shellu pro přiřazení do proměnné, ač to tak opticky vypadá. Dokonce -- což se tak často neví -- tam může být nastavení file-deskriptoru (přesměrování), který se ze zvyku a pro lepší čitelnost dává na pravou stranu až na konec.

    funkce je v podstatě takový "embedded script"

    Jinými slovy: vložený blok makra s expandovanými pozičními parametry, případně vyměněnou proměnnou, která by byla v makru označena jako local

    vysvětlit, proč to vypíše...

    Však jsem psal, že return vrací (spíš posílá) status do stderr. Já psal ale o návratové hodnotě, která jde dál ke zpracování -- nějaký řetězec. V shellu je to jen o přesměrování stdout. Samozřejmě s přivřením oka to můžeme také nazývat návratovou hodnotou, pokud nám nebude vadit, že ji vrací příkaz jako echo nebo printf.
    11.1.2018 10:51 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Shellová zábava
    Samozřejmě to, co je uvedeno na levé straně příkazu/programu.

    Uff… Tak říkat tomu argument by mne ani ve snu nenapadlo. To přece není žádný argument, ta konstrukce prostě znamená "spusť tenhle příkaz s těmito hodnotami těchto proměnných", nic víc a nic méně. S argumenty to nemá nic společného, příkaz nemá žádnou možnost, jak poznat, jestli jste použil tu jednořádkovou konstrukci nebo jste tu proměnnou prostě a jednoduše nastavil klasickým způsobem (jako exportovanou).

    Dokonce -- což se tak často neví -- tam může být nastavení file-deskriptoru (přesměrování), který se ze zvyku a pro lepší čitelnost dává na pravou stranu až na konec.

    Snad nechcete přesměrování také říkat argument? Zkuste se zamyslet např. nad tím, proč

      wc file
      wc <file
    

    mají rozdílný výstup (hlavně proč první vypíše jméno souboru a druhý ne).

    Však jsem psal, že return vrací (spíš posílá) status do stderr. Já psal ale o návratové hodnotě, která jde dál ke zpracování -- nějaký řetězec. V shellu je to jen o přesměrování stdout. Samozřejmě s přivřením oka to můžeme také nazývat návratovou hodnotou, pokud nám nebude vadit, že ji vrací příkaz jako echo nebo printf.

    Je mi líto, ale v tomhle odstavci není pravda skoro nic. Návratová hodnota nemá se stderr nic společného a u funkce funguje v podstatě stejně jako u externího příkazu a stejně se i zpracovává. Návratová hodnota je číslo, žádný řetězec, jak u funkce, tak u externího příkazu. Výstup (standard output) a chybový výstup (standard error) jsou něco úplně jiného.

    11.1.2018 11:33 RM
    Rozbalit Rozbalit vše Re: Shellová zábava
    Tak mohl jsem to nazvat pravou a levou stranou příkazu nebo tokeny před a za příkazem; přesměrování je samozřejmě věcí shellu a program s tím nemá nic společného. Já se na to dívám stále jako na výraz na řádku shellu, zkuste mi tedy prominout zjednodušení "pravý a levý argument". Přesnější dělení tu -- podle mne -- nebylo potřeba. Máte ale pravdu, že stderr se statusem nesouvisí, to jsem napsal špatně; sám se tomu teď divím. Jinak myslím, že vše ostatní platí.
    11.1.2018 01:09 ehm
    Rozbalit Rozbalit vše Re: Shellová zábava
    DFTT. Psal to už Michal Kubeček v #3. Kdybyste si to s Odinem přečetli, mohlo mu zbýt o několik minut víc času na jeho dva psy a tobě na abstraktní univerzálně konfigurovatelný multi-threading enterprise edition rozblikávač LED.
    limit_false avatar 11.1.2018 13:37 limit_false | skóre: 23 | blog: limit_false
    Rozbalit Rozbalit vše Re: Shellová zábava
    U bashe jsem nasel tohle divne chovani:

    ls -d [A-Z]*

    V bashi vypise i soubory nezacinajici velkym pismenem. Pod zsh to ma ocekavany vysledek. Nevim zda je to zpusobeno locale nebo cim, ale ani nastaveni locale na LC_ALL=C to chovani nezmeni.
    When people want prime order group, give them prime order group.
    11.1.2018 13:49 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Shellová zábava

    Works for me:

    mike@unicorn:/tmp/a> ls -d [A-Z]*
    A  b  B  c  C  d  D
    mike@unicorn:/tmp/a> LC_ALL=C
    mike@unicorn:/tmp/a> ls -d [A-Z]*
    A  B  C  D
    
    17.1.2018 10:38 Lyco | skóre: 14 | blog: Lyco
    Rozbalit Rozbalit vše Re: Shellová zábava
    Jistě že to závisí na locale. Ovšem výsledek záleží na locale shellu (jaké parametry se předají a v jakém pořadí) a na locale ls (jak se jména souborů seřadí a jak se interpretují):
    [lyco@hubb test]$ LC_ALL=cs_CZ.utf8
    [lyco@hubb test]$ ls *
    a  A  á  Á  b  B  c  C  č  Č
    [lyco@hubb test]$ ls [A-C]*
    A  á  Á  b  B  c  C
    [lyco@hubb test]$ ls [A-Z]*
    A  á  Á  b  B  c  C  č  Č
    [lyco@hubb test]$ LC_ALL=C
    [lyco@hubb test]$ ls [A-C]*
    A  B  C
    [lyco@hubb test]$ 
    [lyco@hubb test]$ LC_ALL=C ls [A-C]*
    A  B  C
    [lyco@hubb test]$ LC_ALL=cs_CZ.utf8
    [lyco@hubb test]$ LC_ALL=C ls [A-C]*
     A   B   C   b   c  ''$'\303\201'  ''$'\303\241'
    Příspěvek se rázem stává až o 37,5 % pravdivější, je-li pod ním napsáno reálné jméno.

    Založit nové vláknoNahoru

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.