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 23:33 | Humor

    Prezident USA Donald Trump během svého projevu na valném shromáždění OSN 22. září 2026 prohlásil, že umělá inteligence 'bude dále oficiálně nazývána superinteligencí', zkráceně SI. Svůj návrh zdůvodnil takto: 'Použití slova artificial činí inteligenci falešnou. Ona falešná není, ve skutečnosti je úžasná'. Zároveň ve svém proslovu prohlásil, že Spojené státy kategoricky odmítají jakékoliv pokusy o vytvoření 'globalistického

    … více »
    AfD 💙 | Komentářů: 2
    včera 23:22 | Nová verze

    Čínská technologická firma Xiaomi představila novou verzi 2.6 svého modelu MiMo, váhy modelů MiMo‑V2.6‑Pro‑RL a MiMo‑V2.6‑Flash‑RL jsou dostupné na HuggingFace pod licencí MIT. Výkonnější varianta Pro má přes bilion parametrů, z toho 42 miliard aktivních, úspornější Flash 309 miliard parametrů, z nichž se při generování aktivuje přibližně 15 miliard. Oba modely mají délku kontextového okna milion tokenů. Tyto MoE modely zvládají

    … více »
    AfD 💙 | Komentářů: 0
    včera 03:33 | Komunita

    Proběhl Snapdragon Summit 2026. Společnost Qualcomm se mimo jiné pochlubila během Linuxu na čipech Snapdragon X2. Zatím pouze v ranní verzi vhodné pro vývojáře linuxových distribucí a přispěvatele do jádra Linux.

    Ladislav Hagara | Komentářů: 0
    24.9. 21:11 | Nová verze

    Byla vydána nová verze 2.0 klienta F-Droid určeného pro instalaci bezplatných a otevřených mobilních aplikací do Androidu ze softwarového repozitáře F-Droid (Wikipedie). Jedná se o alternativu k Google Play.

    Ladislav Hagara | Komentářů: 5
    24.9. 12:11 | Komunita

    Debian Inference Portal nabízí vývojářům Debianu bezplatný přístup ke službám AI/LLM. Sponzorem je společnost Scaleway.

    Ladislav Hagara | Komentářů: 0
    24.9. 11:44 | Bezpečnostní upozornění

    Robert Ressl nalezl ve WordPressu kritickou zranitelnost CVE-2026-87902 s CVSS 9.2. Útočníkům umožňuje neoprávněný přístup k souborům a vzdálené spuštění kódu (RCE). Opravena je ve verzích 7.1.2, 7.0.6, 6.9.9…

    Ladislav Hagara | Komentářů: 0
    24.9. 03:33 | IT novinky

    Společnost Meta na dvoudenní konferenci Meta Connect 2026 představuje své novinky. Vypíchnout lze lehké brýle s funkci VR Meta VR Glasses. Do prodeje půjdou na jaře 2027 za cenu 1299,99 dolarů.

    Ladislav Hagara | Komentářů: 0
    23.9. 14:44 | Nová verze

    Google Chrome 154 byl prohlášen za stabilní. Nejnovější stabilní verze 154.0.8037.57 přináší řadu novinek. Podrobný přehled v poznámkách k vydání. Opraveno bylo 108 bezpečnostních chyb. Vylepšeny byly také nástroje pro vývojáře.

    Ladislav Hagara | Komentářů: 6
    23.9. 14:33 | IT novinky

    Vláda sníží v příštím roce výdaje na IT služby státu o 1,4 miliardy korun. Úspory má umožnit lepší koordinace nákupu služeb napříč resorty prostřednictvím nového zmocněnce. Celkové roční výdaje státu na informační technologie a digitalizaci se podle údajů ministerstva průmyslu a obchodu pohybují okolo 20 až 25 miliard korun ročně, pro letošek bylo na 320 projektů vyčleněno 21 miliard.

    Ladislav Hagara | Komentářů: 10
    23.9. 14:22 | IT novinky

    Irská komise pro ochranu dat (DPC) uložila americké technologické společnosti Google ze skupiny Alphabet pokutu 403 milionů eur (9,8 miliardy Kč) za neoprávněné nakládání s údaji o poloze uživatelů. Firma podle komise porušila evropské nařízení o ochraně osobních údajů (GDPR). DPC uvedla, že při šetření zjistila, že si lidé nemuseli být vědomi skutečnosti, že jejich poloha byla využívána například k ovlivňování prostřednictvím reklam nebo k odvozování jejich zájmů, a mohli tak ztratit kontrolu nad svými osobními údaji.

    Ladislav Hagara | Komentářů: 2
    Které desktopové prostředí na Linuxu používáte?
     (9%)
     (7%)
     (4%)
     (21%)
     (29%)
     (8%)
     (5%)
     (2%)
     (14%)
     (20%)
    Celkem 2730 hlasů
     Komentářů: 31, poslední 13.8. 00:27
    Rozcestník

    Unixové nástroje – 15 (basename/dirname, test, read)

    9. 7. 2010 | David Watzke | Návody | 7461×

    V tomto díle si povíme něco o příkazech často používaných v shellových skriptech: basename/dirname, test a read.

    Obsah

    basename a dirname

    link

    Tyto dva příkazy slouží k získání konkrétní části cesty k souboru. Oběma příkazům se zadává kompletní cesta k souboru či adresáři. Příkaz basename slouží k výpisu samotného názvu souboru či adresáře, který získá ze zadané cesty, zatímco příkaz dirname vypíše název nadřazeného adresáře.

    $ basename /tmp/soubor.txt
    soubor.txt
    
    $ dirname /tmp/soubor.txt
    /tmp
    

    Toto se hodí v různých skriptech, které přímo pracují se soubory. V různých shellech lze tyto externí příkazy nahradit za (podstatně) rychlejší vestavěné funkce, například v Bashi lze použít toto:

    $ cesta="/home/dave/file.ogg"
    $ adresar="${cesta%/*}"
    $ soubor="${cesta##*/}"
    $ echo -e "cesta: $cesta\nadresar: $adresar\nsoubor: $soubor"
    cesta: /home/dave/file.ogg
    adresar: /home/dave
    soubor: file.ogg
    

    Ovšem zde je důležité podotknout, že chování těchto dvou metod není úplně stejné. Můžete si to zkusit například na tomto příkladu:

    $ cesta="/tmp/xyz/"
    $ basename "$cesta"
    xyz
    $ echo "${cesta##*/}
    # nevypíše nic
    

    Proč bashová metoda nevypíše nic? Protože ${cesta##*/} znamená odstranění části řetězce z proměnné $cesta od začátku až po poslední lomítko (včetně).

    Příkaz basename má ještě jednu vlastnost. Zadáte-li jako druhý argument příponu, tak ji z názvu souboru odstraní. Tedy za předpokladu, že by to neznamenalo výpis prázdného řetězce a že byla daná přípona v názvu nalezena. Není-li daná přípona v názvu nalezena, není to považované za chybu.

    $ basename "/tmp/velky_soubor.tar.xz" .xz
    velky_soubor.tar
    

    test

    link

    Příkaz test slouží k vyhodnocování různých výrazů a tvrzení. Použijete-li příkaz správně, tak vždy pouze vrátí návratovou hodnotu 0, nebo 1 jako signalizaci, že tvrzení platí, nebo neplatí, a nic nevypíše.

    test dovede pracovat se soubory a adresáři. Umí ověřit, zda je soubor či adresář zapisovatelný (přepínač -w), spustitelný (-x), zda lze číst (-r) či zda vůbec existuje (-e). Dále umí zjistit, zda je soubor obyčejný soubor (-f), blokové zařízení (-b), znakové zařízení (-c), symbolický odkaz (-h nebo -L), pojmenovaná roura FIFO (-p), socket (-S) či adresář (-d).

    # ověřuje, zda cesta „/“ ukazuje na adresář;
    # vrátí 0 (pravda), protože kořenový adresář existuje vždy
    test -d /
    
    # ověřuje, zda existuje soubor /tmp/xyz
    test -e /tmp/xyz
    

    Pomocí test lze také zkoumat řetězce znaků.

    # pravda, pokud je řetězec $X nenulový
    test "$X"
    
    # pravda, pokud jsou řetězce $A a $B stejné
    test "$A" = "$B"
    
    # pravda, pokud jsou řetězce navzájem různé
    test "$B" != "$C"
    
    # pravda, pokud je řetězec nulové délky;
    # toto vrátí 0
    test -z ""
    

    Dále lze porovnávat celá čísla. Je možné použít operátory:

    • rovná se (-eq),
    • nerovná se (-ne),
    • větší než (-gt),
    • větší nebo rovno (-ge),
    • menší než (-lt) a
    • menší nebo rovno (-le).
    # pravda, 150 je menší nebo rovno 150
    test 150 -le 150
    
    # nepravda, 100 = 100
    test 100 -ne 100
    

    Výrazy lze kombinovat pomocí přepínačů -a (logický AND, tedy „a zároveň“) nebo -o (logický OR, „nebo“). Dále je lze negovat přidáním vykřičníku před výraz. Můžeme také ovlivňovat prioritu vyhodnocování výrazů pomocí závorek.

    # vrátí 1, protože minimálně druhý výraz neplatí (s -a musí platit oba)
    test \( -w /tmp \) -a \( 100 -eq 101 \)
    
    # pokud je adresář /tmp zapisovatelný, vrátí 0, protože platí alespoň jeden výraz
    test \( -w /tmp \) -o \( 100 -eq 101 \)
    
    # pravda, pokud soubor není zapisovatelný
    test ! -w "soubor"
    

    V praxi se test používá v shellových skriptech, nejčastěji v kombinaci s podmínkou if. Také se často místo test píše pouze hranatá závorka [, přičemž je to totéž, ale takto zapsaný příkaz je nutné ukončit opačnou hranatou závorkou ].

    # toto:
    test -x skript.sh
    # je totéž jako toto:
    [ -x skript.sh ]
    

    Předvedeme si ukázkové použití v Bashi. Píšeme funkci my_mkdir, které zadáte název adresáře a ona jej vytvoří, pokud neexistuje. Ovšem nejdříve ověří, zda již neexistuje soubor či adresář stejného názvu a zařídí se podle toho (vypíše patřičnou informaci). Pomineme, že taková funkce nemá valný význam, protože mkdir podobné kontroly dělá sám.

    my_mkdir() {
    	# pokud soubor či adresář s tímto názvem již existuje
    	if [ -e "$1" ]; then
    		# pokud adresář s tímto názvem již existuje
    		if [ -d "$1" ]; then
    			echo "Adresář s tímto názvem již existuje."
    			return 0
    		else
    			echo "Již existuje soubor se stejným názvem." >&2
    			return 1
    		fi
    	else
    		# vytvoříme adresář, protože soubor ani adresář s daným názvem neexistuje
    		if mkdir -p "$1"; then
    			echo "Adresář byl úspěšně vytvořen."
    			return 0
    		else
    			echo "Adresář se nepodařilo vytvořit." >&2
    			return 1
    		fi
    	fi
    }
    

    read

    link

    read je šikovný nástroj, který slouží k načtení jednoho řádku ze standardního vstupu do dané proměnné (či více proměnných).

    Když vyžadujeme od uživatele nějaký vstup za běhu programu, můžeme read použít následovně:

    echo -n "Jak se jmenuješ? "
    read NAME
    echo "Právě jsi mi prozradil, že se jmenuješ ${NAME}."
    

    read má jediný přepínač, a sice -r, který slouží k nastavení toho, jak se má nakládat s výskytem znaku „\“ (zpětné lomítko). Bez něj je považován za escapující znak, přičemž s ním je brán doslova jako znak „\“.

    Často se ve skriptech používá ke zpracování textového souboru řádek po řádku, pomocí cyklu while. Následuje ukázka v Bashi, která očísluje řádky daného souboru.

    x="$IFS"
    IFS=""
    n=0
    while read -r line; do
    	echo "$((++n)) $line"
    done < soubor.txt
    IFS="$x"
    

    Je možné načítat i do více proměnných najednou:

    $ read a b
    acko becko
    $ echo $b :: $a
    becko :: acko
    

    Znak, podle kterého se daný řetězec rozdělí na několik částí, je dán proměnnou IFS, jak je naznačeno výše. Výchozí hodnota této proměnné jsou speciální znaky tab, mezera a nový řádek. Pokud je proměnná IFS nastavená na prázdnou hodnotu (pomocí IFS=""), k žádnému rozdělení nedojde.

           

    Hodnocení: 100 %

            špatné • dobré        

    Nástroje: Tisk bez diskuse

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

    Komentáře

    Vložit další komentář

    9.7.2010 00:44 Pavel
    Rozbalit Rozbalit vše Re: Unixové nástroje – 15 (basename/dirname, test, read)
    Me oblibene...
     cat neco | while read line; ...
    9.7.2010 02:05 Ash | skóre: 53
    Rozbalit Rozbalit vše Re: Unixové nástroje – 15 (basename/dirname, test, read)
    Ta varianta uvedená v článku má vůči této jisté objektivní výhody.
    9.7.2010 09:13 vlk
    Rozbalit Rozbalit vše Re: Unixové nástroje – 15 (basename/dirname, test, read)
    Radsej takto :
        <neco while read line; ...
    
    9.7.2010 10:18 Pavel
    Rozbalit Rozbalit vše Re: Unixové nástroje – 15 (basename/dirname, test, read)
    Dost casto potrebuju mezi tim catem a while neco grepovat, takze zobak je hezky, ale malo platny...
    9.7.2010 12:30 Mti. | skóre: 31 | blog: Mti
    Rozbalit Rozbalit vše Re: Unixové nástroje – 15 (basename/dirname, test, read)
    Oboji ma svoje. Ta roura Ti zase z toho while nepusti ven promenne... alespon ne naprimo.
    Vidim harddisk mrzuty, jehoz hlava plotny se dotyka...
    9.7.2010 12:51 Ash | skóre: 53
    Rozbalit Rozbalit vše Re: Unixové nástroje – 15 (basename/dirname, test, read)
    V Bashi lze i <(grep foo soubor.txt) což spojuje oboje výhody do jednoho. Ale to jen doplňuji, nic proti cat sem | tam.
    10.7.2010 04:10 zulu
    Rozbalit Rozbalit vše Re: Unixové nástroje – 15 (basename/dirname, test, read)
    A to takhle nemůžeš?
    10.7.2010 04:12 zulu
    Rozbalit Rozbalit vše Re: Unixové nástroje – 15 (basename/dirname, test, read)
    Beru zpět, špatně jsem si to vyložil.
    10.7.2010 04:07 zulu
    Rozbalit Rozbalit vše Re: Unixové nástroje – 15 (basename/dirname, test, read)
    A to funguje kde?
    10.7.2010 23:41 plk
    Rozbalit Rozbalit vše Re: Unixové nástroje – 15 (basename/dirname, test, read)
    co kde kdy jak proc?
    11.7.2010 04:55 zulu
    Rozbalit Rozbalit vše Re: Unixové nástroje – 15 (basename/dirname, test, read)
    <neco while
    11.7.2010 14:26 Ash | skóre: 53
    Rozbalit Rozbalit vše Re: Unixové nástroje – 15 (basename/dirname, test, read)
    Předpokládám že v sh, bash, zsh, csh, tcsh, máte nějaké podezření že to někde nefunguje?
    11.7.2010 20:01 Jirka P
    Rozbalit Rozbalit vše Re: Unixové nástroje – 15 (basename/dirname, test, read)
    Takhle to nefunguje nikde, ono totiž aby shell poznal (podle gramatiky) cyklus, musí být to rezervované slovo první. Nefunguje to minimálně v bashi a v dashi (co jsem teď vyzkoušel).

    Podle posixové gramatiky navíc

    <neco while x

    znamená spuštění příkazu "while" (existuje-li někde na disku) s parametrem x a vstupem přesměrovaným z neco.
    11.7.2010 20:56 Ash | skóre: 53
    Rozbalit Rozbalit vše Re: Unixové nástroje – 15 (basename/dirname, test, read)
    No jak jsem říkal, ta varianta popisovaná v článku má své výhody. Máte pravdu, nevím kam na tohle vlk šel, možná v tom zsh. Osobně používám to co je v článku.
    9.7.2010 02:03 Ash | skóre: 53
    Rozbalit Rozbalit vše Re: Unixové nástroje – 15 (basename/dirname, test, read)
    read má jediný přepínač, a sice -r

    Běžné jsou i ready (asi ne POSIX?) co mají ještě -p.
    read -p "Jak se jmenuješ? " NAME
    13.7.2010 17:41 pht | skóre: 48 | blog: pht
    Rozbalit Rozbalit vše Re: Unixové nástroje – 15 (basename/dirname, test, read)
    read [-ers] [-u fd] [-t timeout] [-a aname] [-p prompt] [-n nchars] [-d delim] [name ...]
    (bash)
    In Ada the typical infinite loop would normally be terminated by detonation.
    13.7.2010 20:24 Ash | skóre: 53
    Rozbalit Rozbalit vše Re: Unixové nástroje – 15 (basename/dirname, test, read)
    Dobré :)
    13.7.2010 17:43 pht | skóre: 48 | blog: pht
    Rozbalit Rozbalit vše Re: Unixové nástroje – 15 (basename/dirname, test, read)
    K basename a dirname bych dodal ještě užitečný příkaz readlink.
    In Ada the typical infinite loop would normally be terminated by detonation.
    LennyCZ avatar 22.7.2010 00:06 LennyCZ | skóre: 8 | Brno
    Rozbalit Rozbalit vše Re: Unixové nástroje – 15 (basename/dirname, test, read)
    Jak je prosím možné toto (jde o bash)?
    lennycz@hugo:~$ IFS=x
    lennycz@hugo:~$ read a b
    aaaxbbbxcccxddd
    lennycz@hugo:~$ echo $a
    aaa
    lennycz@hugo:~$ echo $b
    bbb ccc ddd
    lennycz@hugo:~$ 
    
    Čekal bych jedno z tohoto:
    1. $a bude aaa a $b bude bbb, zbytek se zahodí
    2. $a bude aaa a $b bude pole složené z bbb, ccc a ddd, pak by se ale výpis měl objevit jako bbbxcccxddd, protože $IFS je nastaveno na x
    Pletu se? (To je řečnická otázka, evidentně ano :-D)

    Jinak samozřejmě díky za skvělý seriál :D...
    Given a choice between dancing pigs and security, users pick dancing pigs every time. (Dancing pigs problem)
    22.7.2010 07:30 petr_p | skóre: 59 | blog: pb
    Rozbalit Rozbalit vše Re: Unixové nástroje – 15 (basename/dirname, test, read)
    Bash má vestavěný příkaz help. Prostudujte si výstup příkazu help read. Píše se tam, že do poslední proměnné se uloží zbytek řetězce.
    LennyCZ avatar 22.7.2010 16:09 LennyCZ | skóre: 8 | Brno
    Rozbalit Rozbalit vše Re: Unixové nástroje – 15 (basename/dirname, test, read)
    Díky za vysvětlení, o příkazu help jsem nevěděl.
    Given a choice between dancing pigs and security, users pick dancing pigs every time. (Dancing pigs problem)

    Založit nové vlákno • Nahoru

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