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í
×
dnes 13:55 | Nová verze

Byla vydána verze 3.32 poštovního klienta Geary (Wikipedie). Změněno bylo číslování verzí. Předchozí verze byla 0.13. Nově bude číslování verzí stejné jako u GNOME.

Ladislav Hagara | Komentářů: 0
dnes 01:33 | Nová verze

Byla vydána nová major verze 4 průběžně aktualizované (rolling release) linuxové distribuce Solus (Wikipedie). Přehled novinek i s náhledy v příspěvku na blogu. Solus 4 je ke stažení v edicích Budgie, GNOME a MATE. Solus používá správce balíčku eopkg. Dotazy a odpovědi v novém diskusním fóru.

Ladislav Hagara | Komentářů: 0
včera 22:11 | Zajímavý software

Brian Linkletter se na svém blogu věnuje open source síťovým simulátorům. V nejnovějším příspěvku představuje open source síťový emulátor vrnetlab (VR Network Lab). Ten k běhu jednotlivých routerů používá Docker.

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

Společnost SUSE natočila a na YouTube zveřejnila nový videoklip: Walk Like A Chameleon - SUSE Music Parody.

Ladislav Hagara | Komentářů: 17
včera 00:11 | Nová verze

Byla vydána verze 0.71 populárního telnet a ssh klienta PuTTY. Podrobnosti v přehledu změn. Řešeno je také několik bezpečnostních chyb. Nalezení většiny z nich bylo sponzorováno Evropskou komisí.

Ladislav Hagara | Komentářů: 0
15.3. 22:44 | Nová verze

V rámci projektu OpenRA je vyvíjen svobodný engine pro starší strategické hry Command & Conquer (nyní jsou freeware) a Dune 2000. Vydání 20190314 pokrývá změny za posledního půl roku: vylepšené chování jednotek, přepis kódu pro AI a celkem 9 nových misí pro jednoho hráče.

Fluttershy, yay! | Komentářů: 2
15.3. 21:33 | Nová verze

Po půl roce vývoje od vydání verze 1.14.0 byla vydána nová verze 1.16.0 sady nástrojů pro správu síťových připojení NetworkManager. Novinkám se na svých blozích věnují Ľubomír Rintel a Thomas Haller. Zdůrazněna je podpora WireGuardu.

Ladislav Hagara | Komentářů: 0
15.3. 14:55 | Nová verze

Po deseti měsících vývoje od vydání verze 3.1 byla vydána nová stabilní verze 3.2 proprietárního multiplatformního editoru textových souborů a zdrojových kódů Sublime Text (Wikipedie). Přehled novinek v příspěvku na blogu. Sublime Text je ke stažení a k vyzkoušení zdarma. Pro další používání je nutná licence v ceně 80 dolarů. Vývojáři editoru Sublime Text nedávno představili svého git klienta Sublime Merge. Ten je také ke stažení a k vyzkoušení zdarma. Licence stojí 99 dolarů.

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

Příspěvek na blogu Giant Pockets představuje emulátor Box86 umožňující spouštět aplikace pro x86 na architektuře ARM. Diskuse na stránkách open source kapesního počítače a herní konzole Pyra.

Ladislav Hagara | Komentářů: 14
14.3. 18:33 | Nová verze

Po více než roce vývoje od vydání verze 3.0 byla vydána verze 3.1 multiplatformního open source herního enginu Godot (Wikipedie, GitHub). Přehled novinek i s náhledy v oficiálním oznámení nebo na YouTube.

Ladislav Hagara | Komentářů: 1
Kolik balíčků (v tisících) máte nainstalovaných na svém systému?
 (4%)
 (13%)
 (34%)
 (30%)
 (20%)
 (4%)
 (2%)
 (2%)
 (3%)
Celkem 199 hlasů
 Komentářů: 16, poslední 14.3. 20:04
Rozcestník

Dotaz: Bash: načtení hodnot oddělených nulovým bajtem \0 do více proměnných

xkucf03 avatar 15.12.2018 19:55 xkucf03 | skóre: 47 | blog: xkucf03
Bash: načtení hodnot oddělených nulovým bajtem \0 do více proměnných
Přečteno: 444×

Potřeboval bych v cyklu načítat hodnoty oddělené nulovým bajtem do proměnných.

Funguje mi tohle -- na každý řádek to vypíše jednu proměnnou:

printf 'a\0b\0c\0d\0' | while read -d '' x; do echo ">$x<"; done
(případně -d $'\0' se chová stejně)

V dokumentaci se ale píše:

-d oddělovač pokračuje, dokud není načten první znak ODDĚLOVAČE namísto nového řádku

Takže pomocí -d to zjevně nepůjde udělat. Zkoušel jsem nastavovat $IFS, ale to nepomohlo. Tohle nefunguje:

printf 'a\0b\0c\0d\0' | while IFS='' read x y; do echo ">$x< >$y<"; done
printf 'a\0b\0c\0d\0' | while read -d ''  x y; do echo ">$x< >$y<"; done

Potřeboval bych dosáhnout něčeho jako:

printf 'a\0b\0c\0d' | xargs -0 -n2 echo

Tzn. ze vstupu se vezmou dva prvky a ty se zpracují jedním příkazem. Ale chci to mít ve while cyklu, abych tam mohl napsat blok kódu. Proběhly by dva cykly a v každém bych měl naplněné dvě proměnné.

Jde toho nějak dosáhnout pomocí read nebo jiného příkazu? Ano, můžu si to napsat v C jako Bash built-in příkaz :-) ale tohle snad už musel někdo řešit, ne?

P.S. pak je ještě problém, že bez koncového \0 načte read jen tři prvky a čtvrtý zahodí, ale to je relativně detail, mohl bych na konec přidávat \0, i když lepší by bylo, aby to bralo i EOF.

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

Řešení dotazu:


Odpovědi

15.12.2018 20:14 Kit | skóre: 43 | Brno
Rozbalit Rozbalit vše Re: Bash: načtení hodnot oddělených nulovým bajtem \0 do více proměnných
Zkusil bych pokračovat v tom, co jsi už nakousnul.
printf 'a\0b\0c\0d' | xargs -0 -n2 echo | while read x y; do echo "$x" "$y"; done
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
xkucf03 avatar 15.12.2018 20:22 xkucf03 | skóre: 47 | blog: xkucf03
Rozbalit Rozbalit vše Re: Bash: načtení hodnot oddělených nulovým bajtem \0 do více proměnných

O tomhle vím (resp. jde to jednodušeji i přes tr \\0 \\n), ale problém je v tom, že když hodnota bude obsahovat znak konce řádku, tak se to rozbije. Proto právě chci pracovat s těmi nulovými bajty, aby tam jinak kromě nich mohlo být cokoli.

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
15.12.2018 20:49 Kit | skóre: 43 | Brno
Rozbalit Rozbalit vše Re: Bash: načtení hodnot oddělených nulovým bajtem \0 do více proměnných
Co takhle místo příkazu echo zavolat skript? Dostane ty dva parametry.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
15.12.2018 21:38 debian+
Rozbalit Rozbalit vše Re: Bash: načtení hodnot oddělených nulovým bajtem \0 do více proměnných
Co tak nacitat vstup do pola a nasledne data spracovat ako pole.
17.12.2018 12:00 Andrej | skóre: 46 | blog: Republic of Mordor | Zürich
Rozbalit Rozbalit vše Re: Bash: načtení hodnot oddělených nulovým bajtem \0 do více proměnných

No, do jednoho pole asi ne, protože co když má vstup 10 EB…

Každopádně se dá vstup postupně načítat do polí se dvěma prvky.

ǑǦŹǓǕǙǞǺǨȞȬḔḦḰḾṊṎṸẄẌỖ
xkucf03 avatar 16.12.2018 00:34 xkucf03 | skóre: 47 | blog: xkucf03
Rozbalit Rozbalit vše Re: Bash: načtení hodnot oddělených nulovým bajtem \0 do více proměnných

Tak jsem to už skoro vyřešil :-)

Definuji si funkci:

read_zero() { for v in "$@"; do export $v; read -r -d $'\0' $v; done }

a následně ji použiji místo read:

printf 'a\0b\0c\0d\0' | while read_zero x y; do echo ">$x< >$y<"; done

Jediný problém je, že za poslední hodnotou musí být \0.

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
xkucf03 avatar 16.12.2018 01:06 xkucf03 | skóre: 47 | blog: xkucf03
Rozbalit Rozbalit vše Re: Bash: načtení hodnot oddělených nulovým bajtem \0 do více proměnných

Tak se mi pravděpodobně povedlo vyřešit i ten poslední problém:

read_zero() { for v in "$@"; do export "$v"; read -r -d '' "$v" || [ ! -z "${!v}" ]; done }
printf 'a\0b\0c\0d' | while read_zero x y; do echo "x='$x' && y='$y'"; done
# vypíše:
# x='a' && y='b'
# x='c' && y='d'
GNU Bash je hodně mocný nástroj :-)
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
16.12.2018 10:01 pavele
Rozbalit Rozbalit vše Re: Bash: načtení hodnot oddělených nulovým bajtem \0 do více proměnných
Nechceš to přepsat do perlu? Nebude to velká změna. :-)
xkucf03 avatar 16.12.2018 10:52 xkucf03 | skóre: 47 | blog: xkucf03
Rozbalit Rozbalit vše Re: Bash: načtení hodnot oddělených nulovým bajtem \0 do více proměnných

A z něj by šlo nastavit proměnnou ven?

Jinak v Perlu jsem to dělal také -- přes xargs šlo do Perlu vždy X proměnných a tam se to přes perl -ne '...tady je perlovský skript, klidně i na víc řádků...' zpracovalo (příklad). Ale teď se právě snažím najít způsob, jak to napsat i celé jen v Bashi a aby tam člověk mohl mít blok kódu, ale šlo to napsat i na jeden řádek. Řešení s vlastní funkcí na jeden řádek není, ale zase tu funkci stačí načíst jednou a pak už ji jen používáš.

Nakonec jsem tam ještě nějakou chybu našel: je problém, když poslední hodnota chybí (tzn. byly by tam dva nulové bajty po sobě) a zároveň chybí ten poslední nulový bajt... ale to už budu řešit tak, že poslední nulový bajt prostě chybět nebude :-)

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
17.12.2018 11:56 Andrej | skóre: 46 | blog: Republic of Mordor | Zürich
Rozbalit Rozbalit vše Re: Bash: načtení hodnot oddělených nulovým bajtem \0 do více proměnných

Mně přijde nejjednodušší readarray.

printf 'a\0b\0c\0d' | for ((;;)); do
  readarray -d $'\0' -n 2 -t array
  ((! ${#array[@]})) && break
  echo "${array[@]@A}"
done

Nulu na konci to toleruje v pohodě, kdyby tam náhodou byla.

Ještě by to mohlo umět hlásit, když počet záznamů není sudý, něco jako ((1 == ${#array[@]})) && echo 'Ultra-fatal error.' 1>&2.

ǑǦŹǓǕǙǞǺǨȞȬḔḦḰḾṊṎṸẄẌỖ
xkucf03 avatar 17.12.2018 18:22 xkucf03 | skóre: 47 | blog: xkucf03
Rozbalit Rozbalit vše Re: Bash: načtení hodnot oddělených nulovým bajtem \0 do více proměnných

Díky, tohle je zajímavé řešení. Sice budu používat asi spíš tu svoji funkci, která to naplní do pojmenovaných proměnných, ale tohle je taky užitečné -- ukládám si to do poznámek pro pozdější použití :-)

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

Založit nové vláknoNahoru

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

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