abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
včera 17:33 | Zajímavý projekt

Na Indiegogo byla spuštěna kampaň na jednodeskový počítač Renegade Elite. Měl by být 4x výkonnější než Raspberry Pi 3 Model B+. Vlastnit jej lze již v září. Aktuální cena je 99 dolarů.

Ladislav Hagara | Komentářů: 6
včera 12:44 | Komunita

Od 7. do 10. června proběhla v Berlíně Linux Audio Conference 2018. Na programu byla řada zajímavých přednášek, seminářů a vystoupení. Videozáznamy lze zhlédnout na media.ccc.de.

Ladislav Hagara | Komentářů: 0
včera 09:44 | Pozvánky

Červencový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 19. 7. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát bude přednáška na téma: automatizační nástroj Ansible, kterou si připravil Martin Vicián.

xkucf03 | Komentářů: 0
14.7. 22:44 | Nová verze

Bylo oznámeno vydání KDE Frameworks 5.48.0, tj. nové verze aktuálně 72 knihoven rozšířujících multiplatformní framework Qt. Řešena je mimo jiné bezpečnostní chyba CVE-2018-10361 v KTextEditoru zneužitelná k lokální eskalaci práv. Knihovny KDE Frameworks jsou dnes využívány nejenom KDE Plasmou a KDE Aplikacemi.

Ladislav Hagara | Komentářů: 5
14.7. 20:11 | Nová verze

Byl vydán Debian 9.5, tj. pátá opravná verze Debianu 9 s kódovým názvem Stretch. Řešeny jsou především bezpečnostní problémy, ale také několik vážných chyb. Předchozí instalační média Debianu 9 Stretch lze samozřejmě nadále k instalaci používat. Po instalaci stačí systém aktualizovat.

Ladislav Hagara | Komentářů: 13
13.7. 23:55 | Komunita

V Národní technické knihovně (NTK) je 150 nových počítačů s operačním systémem Linux, konkrétně s linuxovou distribucí Fedora. Do konce prázdnin si na nich lze zahrát počítačovou hru Factorio (Wikipedie). V pondělí 23. 7. proběhne LAN party s vývojáři této hry.

Ladislav Hagara | Komentářů: 0
13.7. 17:33 | Zajímavý software

Fanatical (Wikipedie) má ve slevě řadu počítačových her běžících také na Linuxu. Balíček her Fanatical Strategy Bundle lze koupit za 1,99 eur.

Ladislav Hagara | Komentářů: 1
13.7. 11:44 | Zajímavý software

Byla vydána počítačová hra Warhammer 40,000: Gladius - Relics of War běžící také na Linuxu. Koupit ji lze na GOG, Humble Store i na Steamu. Videoukázka na YouTube.

Ladislav Hagara | Komentářů: 0
13.7. 10:33 | Komunita

Guido van Rossum, původní tvůrce a doposud vedoucí projektu Python, oznámil, že opouští svou roli, tedy již se nebude podílet na tvorbě PEP a výběru hlavních vývojářů, odchází na odpočinek a do budoucna bude nejvýše řadovým přispěvatelem. Situace vyplynula mj. z procesu schvalování PEP 572.

Fluttershy, yay! | Komentářů: 4
12.7. 17:22 | Nasazení Linuxu

Článek na OMG! Ubuntu! představuje vesmírného interaktivního asistenta CIMON (Crew Interactive Mobile CompaniON) vyvinutého ve spolupráci firem Airbus a IBM. Uvnitř této osmikilogramové koule s osmipalcovým displejem běží Ubuntu. Více ve videu na YouTube.

Ladislav Hagara | Komentářů: 7
Jak čtete delší texty z webových stránek?
 (77%)
 (20%)
 (5%)
 (7%)
 (2%)
 (10%)
Celkem 354 hlasů
 Komentářů: 40, poslední 29.6. 10:21
    Rozcestník

    Shellová zábava

    10.1. 17:55 | Přečteno: 1320× | poslední úprava: 10.1. 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. 19:35 Max | skóre: 66 | 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. 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. 20:06 Michal Kubeček | skóre: 71 | 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. 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. 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. 11:19 skunkOS | skóre: 26 | 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. 20:04 Michal Kubeček | skóre: 71 | 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. 03:24 pc2005 | skóre: 36 | 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. 11:11 oryctolagus | skóre: 29 | blog: Untitled
    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. 14:26 Max | skóre: 66 | 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. 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. 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. 23:12 marbu | skóre: 29 | blog: hromada | Brno
    Rozbalit Rozbalit vše Re: Shellová zábava
    Ne :)
    I think warning here is a bug. The biggest cloud service provider. There is no point in being so cool in a cold world.
    10.1. 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. 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. 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. 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. 23:25 xkucf03 | skóre: 46 | 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-Výuka.cz, Nekuřák.net
    11.1. 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. 07:01 Michal Kubeček | skóre: 71 | 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. 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. 09:53 Michal Kubeček | skóre: 71 | 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. 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. 10:51 Michal Kubeček | skóre: 71 | 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. 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. 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. 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. 13:49 Michal Kubeček | skóre: 71 | 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. 10:38 Lyco | skóre: 12 | 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.