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 16:00 | Nová verze

Byl vydán Mozilla Firefox 51.0. Z novinek lze upozornit například na upozorňování na přihlašování přes nešifrované spojení (HTTP), podporu pro přehrávání bezeztrátového formátu FLAC nebo podporu WebGL 2. Podrobné informace v poznámkách k vydání a na stránce věnované vývojářům. Řešeny jsou také bezpečnostní chyby.

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

Do prodeje (Farnell) se dostal jednodeskový počítač Tinker Board (unboxing). Jedná se o konkurenci Raspberry Pi 3 od společnosti Asus. Porovnání (jpg) těchto počítačů například na CNXSoft. Cena Tinker Boardu je 55 £.

Ladislav Hagara | Komentářů: 14
včera 14:44 | Zajímavý projekt

Byla zveřejněna pravidla hackerské soutěže Pwn2Own 2017, jež proběhne od 15. do 17. března v rámci bezpečnostní konference CanSecWes ve Vancouveru. Soutěžit se bude o více než milion dolarů v pěti kategoriích. Letos se bude útočit i na Ubuntu. Jedná se již o 10. ročník této soutěže.

Ladislav Hagara | Komentářů: 2
včera 13:33 | Nová verze

Po sedmi měsících vývoje od vydání verze 5.7 byla vydána verze 5.8 (YouTube) toolkitu Qt. Z novinek lze zmínit například Qt Lite pro vestavěná zařízení. Nově jsou plně podporovány moduly Qt Wayland Compositor (YouTube) a Qt SCXML (YouTube). Současně byla vydána verze 4.2.1 integrovaného vývojového prostředí (IDE) Qt Creator.

Ladislav Hagara | Komentářů: 1
včera 11:52 | Pozvánky

Lednový Prague Containers Meetup se koná ve čtvrtek 26. ledna 2017 od 18:00 v Apiary, Pernerova 49, Praha 8. Přijďte se podívat na přednášky o Enterprise Kubernetes a Jenkins as a code.

little-drunk-jesus | Komentářů: 0
včera 11:40 | Pozvánky

Program letošního ročníku konference Prague PostgreSQL Developer Days, která se koná již 15. a 16. února 2017 na ČVUT FIT, Thákurova 9, Praha 6, byl dnes zveřejněn. Najdete ho na stránkách konference včetně anotací přednášek a školení. Registrace na konferenci bude otevřena zítra (24. ledna) v brzkých odpoledních hodinách.

TomasVondra | Komentářů: 0
22.1. 02:20 | Zajímavý článek

David Revoy, autor open source webového komiksu Pepper&Carrot nebo portrétu GNU/Linuxu, upozorňuje na svém blogu, že nový Inkscape 0.92 rozbíjí dokumenty vytvořené v předchozích verzích Inkscape. Problém by měl být vyřešen v Inkscape 0.92.2 [reddit].

Ladislav Hagara | Komentářů: 0
22.1. 02:02 | Komunita

Øyvind Kolås, hlavní vývojář grafických knihoven GEGL a babl, které využívá grafický program GIMP, žádá o podporu na Patreonu. Díky ní bude moci pracovat na vývoji na plný úvazek. Milník 1000 $, který by stačil na holé přežití, se již téměř podařilo vybrat, dalším cílem je dosažení 2500 $, které mu umožní běžně fungovat ve společnosti.

xkomczax | Komentářů: 12
21.1. 23:54 | Pozvánky

DevConf.cz 2017, již devátý ročník jedné z největších akcí zaměřených na Linux a open source ve střední Evropě, proběhne od pátku 27. ledna do neděle 29. ledna v prostorách Fakulty informačních technologií Vysokého učení technického v Brně. Na programu je celá řada zajímavých přednášek a workshopů. Letos je povinná registrace.

Ladislav Hagara | Komentářů: 0
21.1. 22:11 | Nová verze

Byla vydána verze 1.0.0 emulátoru terminálu Terminology postaveného nad EFL (Enlightenment Foundation Libraries). Přehled novinek v poznámkách k vydání.

Ladislav Hagara | Komentářů: 0
Jak se stavíte k trendu ztenčování přenosných zařízení (smartphony, notebooky)?
 (12%)
 (2%)
 (72%)
 (3%)
 (11%)
Celkem 395 hlasů
 Komentářů: 39, poslední dnes 19:30
Rozcestník
Reklama

Dotaz: Parametr zadaný proměnnou

27.3.2014 13:54 Milan Uhrák | skóre: 25 | blog: milan_at_ABC
Parametr zadaný proměnnou
Přečteno: 213×
Dobrý den

Chtěl jsem vytvořit parametrický find, alr nějak se mi to nedaří.

Když zapíšu příkaz do shellu, udělá, co má dělat. Když ve skriptu nahradím nekteré parametry proměnnou, dostanu chybovou hlášku, popř. příkaz nedělá co by měl. Asi jsem se ztrytil v té syntaxi, tak váa prosím o pomoc.

Toto je jen ukázka
cd "~/data/psi/"
filter="-mtime -2"
exclude='( ! -iname "*ajax*" )'

find . $filter $exclude -type f
zobrazí i "ajax"
cd "~/data/pes/"
filter="-mtime -2"
exclude='\( ! -iname "*ajax*" \)'

find . $filter $exclude -type f
dostanu find: paths must precede expression: \(

Nějak nevím, jak to sestavit, zkoušel jsem pár dalších možností, ale většinou jsem skončil u stejné chyby jako ve druhém případě. Někde dělám chybu, ale nevím kde

Díky za nasměrování

Řešení dotazu:


Odpovědi

27.3.2014 14:26 Gejbriel007
Rozbalit Rozbalit vše Re: Parametr zadaný proměnnou
Co to zkusit úplně bez závorek?
27.3.2014 15:30 Lyco | skóre: 11 | blog: Lyco
Rozbalit Rozbalit vše Re: Parametr zadaný proměnnou
Takhle to nejde. Bash ti parametr vždycky expanduje, a protože asi nemáš soubor který by vyhověl globu "*ajax*" (tj. začínal a končil uvozovkami), tak ho tam vloží doslova. Pokud uvozovky odstraníš, tak expanduje jen na soubory v aktuálním adresáři, což asi nechceš, když používáš find.

Řešením je použít pole, viz http://wiki.bash-hackers.org/syntax/quoting#comment_1e2dcc9cbb8e800c100ab8d0760a5e12

Podle mého názoru to je chyba v návrhu shellu.
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.
rADOn avatar 27.3.2014 16:42 rADOn | skóre: 44 | blog: bloK | Praha
Rozbalit Rozbalit vše Re: Parametr zadaný proměnnou
Chyba paths must precede expression: \( by te mela trknout: jak to ze find vidi to zpetny lomitko? To tam prece davas aby ti zavorku nesezral shell. Do findu by to melo projit uz expandovany cili jestli je tam to lomitko videt tak se ta expanze neprovedla a mas tam zbytecny escapovani navic. Cili ty pitomy lomitka vymaz.

Bych si tak od boku strelil ze jsou za tim uvozovky/apostrofy, tam se vynechava vic expanzi.
"2^24 comments ought to be enough for anyone" -- CmdrTaco
27.3.2014 16:55 Filip Jirsák
Rozbalit Rozbalit vše Re: Parametr zadaný proměnnou
Když spustíte
find -mtime -2 ( ! -iname "*ajax*" )
předáváte do find 7 parametrů.

Když použijete proměnné, je celá proměnná považovaná za jeden parametr. Také ji tak nastavujete – máte její obsah v uvozovkách, tj. je to celé jeden text, včetně těch mezer. Takže váš příkaz
find . $filter $exclude -type f
předá do find 5 parametrů a je ekvivalentní spuštění
find . '-mtime -2' '\( ! -iname "*ajax*" \)' -type f
A tomu find samozřejmě nerozumí.

Pokud chcete předat jednou proměnnou víc parametrů, musíte použít pole. Vyzkoušejte si to třeba na příkazu touch:
test1='abc def'
test2=(ghj ijk)
touch $test1
touch $test2
První touch vytvoří jeden soubor s názvem abc\ def. Druhý dostal jako parametr dvouprvkové pole, vytvoří tedy dva soubory, ghj a ijk.
27.3.2014 18:41 potato
Rozbalit Rozbalit vše Re: Parametr zadaný proměnnou
Když použijete proměnné, je celá proměnná považovaná za jeden parametr.
To je naprostá pitomost.

1) Dokumentace bashe: The order of expansions is: brace expansion, tilde expansion, parameter, variable and arithmetic expansion and command substitution (done in a left-to-right fashion), word splitting, and pathname expansion.

2) Praktický příklad:
x='-h -l -a'
ls $x
27.3.2014 19:36 Filip Jirsák
Rozbalit Rozbalit vše Re: Parametr zadaný proměnnou
Není to pitomost, zsh se chová přesně tak jak jsem popsal. bash se chová jak popisujete vy. Nenapadlo mne, že se v tomhle budou shelly lišit. Z té citované dokumentace to navíc neplyne, protože do x přiřazujete text v apostrofech, takže se to dá klidně chápat tak, že v proměnné bude mezera escapovaná. Ostatně
x='`pwd`'
echo $x
ani bashi nevypíše aktuální adresář, ale vypíše text `pwd`. Takže command substitution už v bashi na obsahu proměnné prováděno není.
27.3.2014 21:10 potato
Rozbalit Rozbalit vše Re: Parametr zadaný proměnnou
První zmínka o zsh v celé diskusi je teď od tebe. Nepíše-li tazatal, že to chce v něčem tak specifickéhm jako zsh, předpokládá se snad posixový shell -- a ten se chová stejně jako bash. Respektive spíš: bash se chová jako posixový shell (viz např. IEEE std 1003.1-2001).
27.3.2014 19:23 Milan Uhrák | skóre: 25 | blog: milan_at_ABC
Rozbalit Rozbalit vše Re: Parametr zadaný proměnnou
JJ.. kdyz dam promenne do uvozovek, tak to tak udela (nechce ani to -mtime) , když bez, tak v poho.
27.3.2014 18:51 potato
Rozbalit Rozbalit vše Re: Parametr zadaný proměnnou
Způsob, jak se neztratit v syntaxi, nebo alespoň vidět, co shell přesně udělá, je
set -x
Jelikož pathname expanse probíhá až po word splittingu, rozumné řešení je skutečně jen přes pole, jak už tu bylo napsáno:
exclude=('(' ! -iname '*sample*' ')')

find . $filter "${exclude[@]}" -type f
Využívá se magické vlastnosti konstrukce "${array[@]}", kterou shell neexpanduje na obsah pole jako jedno slovo, ale na samostatná slova pro každý prvek pole.
27.3.2014 19:32 Milan Uhrák | skóre: 25 | blog: milan_at_ABC
Rozbalit Rozbalit vše Re: Parametr zadaný proměnnou
Stáváte se jednoznačným vítězem nevyhlášené soutěže o bash-hacking :-D ..... opravdu se to musí takhle ohackovat, vyzkoušeno a funguje...

Děkuji všem, kdož se snažili pomoct a doufám, že tato otázka pomůže i mnoha z vás

Milan
27.3.2014 21:15 potato
Rozbalit Rozbalit vše Re: Parametr zadaný proměnnou
Nepříjemné samozřejmě je, že pole nejsou součástí posixového shellu. Sice jsou v bashi i ksh, ale v jednoduchých shellech jako dash narazíte...

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.