
Programování v BASH
Dobrý den, narazil jsem na vaši poradnu a myslel jsem si, že by mi odsud mohl někdo pomoct. Konkrétně bych potřeboval pomoct s programováním skriptu v BASH, ale vidim to uplně poprvě a nevim o tom skoro nic, jen něco z přednášek a co jsem se dočetl, ale nevim jak pořádně psát příkazy atd... Mohl byste mě někdo trochu pomoc se zadáním mého úkolu?
Znění úkolu:
Cílem úlohy je vytvořit skript (tzv. wrapper), který bude spouštět textový editor. Skript si bude pamatovat, které soubory byly v jakém adresáři prostřednictvím daného skriptu editovány. Pokud bude skript spuštěn bez parametrů, vybere skript soubor, který má být editován.
Specifikace chování skriptu
JMÉNO
wedi - wrapper textového editoru s možností automatického výběru souboru
POUŽITÍ
wedi [ADRESÁŘ]
wedi -m [ADRESÁŘ]
wedi SOUBOR
wedi -l [ADRESÁŘ]
wedi -b|-a DATUM [ADRESÁŘ]
POPIS
Pokud byl skriptu zadán soubor, bude editován.
Pokud není argumentem skriptu zadáno jméno editovaného souboru, skript z daného adresáře vybere soubor pro editaci. Výběr je následující:
Pokud bylo v daném adresáři editováno skriptem více souborů, vybere se soubor, který byl pomocí skriptu editován jako poslední. Editací souboru se myslí třeba i prohlížení jeho obsahu pomocí skriptu (tj. není nutné, aby byl soubor změněn).
Pokud byl zadán argument -m, vybere se soubor, který byl pomocí skriptu editován nejčastěji.
Pokud nebyl v daném adresáři editován ještě žádný soubor, jedná se o chybu.
Pokud nebyl zadán adresář, předpokládá se aktuální adresář.
Skript dokáže také zobrazit seznam všech souborů (argument -l), které byly v daném adresáři editovány.
Pokud byl zadán argument -b resp. -a (before, after), skript zobrazí seznam souborů, které byly editovány před resp. po zadaném datu. DATUM je formátu YYYY-MM-DD. Jsou zobrazeny soubory, které byly skriptem editovány od daného data včetně.Budu vám moc vděčný když mě někdo s tím trochu pomůže. Děkuju mockrát.
Ahoj. Jako student FITu bys měl projevit trochu samostatnosti. K Bashi jde toho najít na netu opravdu spousta. Když jsem dělal projekt do IOSu já, tak jsem začínal od nejjednodušších věcí - musíš si problém dekomponovat a hledat řešení primitivních akcí, např. jak zjistit obsah adresáře, jak spouštět programy, kam přesměrovat výstup atd. Pokud si nebudeš vědět rady s konkrétní věcí, tak se klidně zeptej, ale předhodit celé zadání a čekat že tě někdo povede je trochu naivní..
Já mám problém s tím, že si to nedokážu dekomponovat a rozložit si to na jednoduché problémy, já na to koukám jako na jeden velkej problém.
Co začít tím nejjednodušším? Vytvořit si skript, který napíše hello. Potom tam máš řešit parametry. Takže budeš hledat, jak bash zpracovává parametry a třeba si to hned vyzkoušíš, aby ti skript vypsal všechny parametry, které zadáš. Pak můžou přijít na řadu ty adresáře atd. Nemusíš hned tvořit skript podle zadání. Můžeš si dělat jednoduché skripty, které dělají nějakou primitivní věc. Na tom si vyzkoušíš, jak se to dělá. A poskládat z nich finální skript už nebude problém.
no tak já znám ty jednotlivý příkazy jako echo, ls,cat, atd... ale neumim to poskládat dokupy. Já bych prostě potřeboval nějak navést jak začít co je nejlepší a popř co k tomu všechno budu potřebovat.
obávám se, že jsi zvolil špatný studijní obor. Analýza a dekompozice problému je totiž základ.
já porad doufám ze se to nějak naucim a nepochybuju o tom ale potřebují vědět jak na to
třeba ne, vypadá to jako můj problém. pokud mi ráno vysvětlíš princip, večer programuju.
k tomu výběru parametrů budu potřebovat nejspíš getopts, ale nevim jak to použít.
To si přece můžeš najít ne?
http://wiki.bash-hackers.org/howto/getopts_tutoria l
Jsou tam příklady použití.
tak kdybych teda chtěl začít asi tím nejjednodušším tak je, že ten skript otevře soubor a bude ho editovat. Nevím, ale jak napsat, aby to bralo ten nějakej soubor z argumentu k editaci tzn. vim že ho musim otevřít pomocí exec "editor" ale nevim do jaký proměnnýho dát atd.
http://wiki.bash-hackers.org/commands/builtin/exec
Název souboru bude v některém parametru. Jak ho získat máš v předchozím odkazu (bude v proměnné $OPTARG).
no tak jsem napsal pár prvních řádků ale nefunguje to tak jak jsem si představoval, když dám nějakej přepínač a za něj něco tak mě to vždycky vypíše AHOJ.
můžete mi někdo pomoct sv tím?
Vobec nepotrebujes getopts.
Vstupne argumenty su pod premennymi $1 - $n. Cele pole argumentov je pod premennou $@.
Staci si to pekne ohandlovat na zaciatku scriptu.
V podstate je uloha uplne primitivna. Jedina zlozita vec je pamatanie si metadat o otvorenych/editovanych suboroch. To sa da vyriesit tak, ze si to budes zapisovat do nejakeho svojho skryteho suboru.
Na konci script vzdy otvori vybrany subor pokocou editora vi alebo vim.
já uplně nechápu jak udělat tu editaci program, když zadám např. ./wedi.sh [adresář] nebo soubor aby se ten soubor nebo adresář začli editovat.
tvoj script je len wrapper (obalka) nejakeho ineho textoveho editora. adresar needitujes. ked scriptu zadas adresar, ma nejakou logikou vybrat vhodny subor v danom adresari a ten posunut do textoveho editora.
textovy editor je napriklad vim.
cize ked uz budes mat v nejakej premennej vhodny subor na editaciu, tak ho programu vim len posunies.
skus si v bashi spravit nieco taketo a pochopis:
samozrejme ten nejaky_subor.txt musi existovat, inak sa ti otvori prazdny vim.
oukej to mě funguje, ale teď potřebuju aby mě to fungovalo na kterej koliv soubor co tam zadám
Napriklad takto. V prvom kroku overis, ci do scriptu bol zadany prave jeden parameter. V tvojom pripade pri wrapperi bude tych validacii trochu viac, kedze mozes mat rozne kombinacie vstupnych parametrov.
Nasledne sa overi, ze subor existuje. Ak ano, tak sa otvori v editore vim.
ale jak to zjistí odkud ten soubor má otevřít?
no musis mu poslat celu cestu.
v tvojom pripade (vo wrapperi, ktory mas urobit), bude pride do scriptu adresar (tym sa mysli jeho cela cesta) a vtedy v danom adresari najdes vhodny subor na otvorenie - do vimu potom posles vyskladany string vo forme "adresar" + "/" + "nazov suboru". ak pride subor ten musi prist tiez s celou cestou.
nevim jakou dát proměnnou tomu SOUBOR
jj mockrát dík už jsem na to přišel :), teď to umí otevřít soubor když ho zadám, popř. adresář když zadám :) teď nevim jak udělat aby to vybíralo podle zadání:
A mám problém s pochopením těchto dvou bodů:
Skript si pamatuje informace o svém spouštění v souboru, který je dán proměnnou WEDI_RC. Pokud není proměnná nastavena, jedná se o chybu. Formát souboru není specifikován.
Skript spouští editor, který je nastaven v proměnné EDITOR. Pokud není proměnná EDITOR nastavená, respektuje proměnnou VISUAL. Pokud ani ta není nastavená, jedná se o chybu.
Máš si ukládat a načítat vlastní soubor s nastavením. Formát si určíš sám, je jedno jaký, ale musíš být schopný tam ty informace uložit a zase načíst.
A máš tam mít nějaké dvě proměnné, kde bude asi uložený název programu. Oficiální fórum nefunguje? Kdyžtak se zeptej tam.
kdybych se pták tam tak se ne zeptaj co na ty škole vůbec dělám, mám vytvořeny soubor txt do který ho budu ukládat to nastavení ale nevím cobsi pod tím mám představit
Na věci ohledně zadání, pokud nečemu nerozumíš se tam můžeš ptát neomezeně..
Tak v tom souboru budeš mít např. uložené jméno posledního souboru, který byl editován. Takže třeba úplně nejprimitivnější řešení - uložíš ho na první řádek. Při načítání budeš vědět, že na prvním řádku je jméno toho naposledy editovaného souboru a načteš ten řetězec. Podobně třeba na dalších řádcích můžeš mít názvy ostatních souborů, které už byly editovány. To je jen příklad, ten formát si máš vymyslet podle sebe.
Neslo by to prosim te trochu a konkrétněji ja nevím jak do toho svého skriptu zakomponovat to ukládání souboru vim ze to musím přesměrovat do toho souboru co jsem si vytvořil ale nevím jakým stylem
Lina huba, holy nestesti. Od ceho jsou asi konzultace?
bingo.
Ono není problém poradit a nasměrovat i tady, ale řešit to za někoho určitě nebudeme.
no to celkom nechapem ani ja. moze ist totiz o premennu prostredia (vygoogli si enviroment variables) alebo o premennu priamo v scripte, ale to mi pride menej pravdepodobne.
samozřejmě že se jedná o proměnnou prostředí. Podstatou je ověřit její existenci a případně vygenerovat chybovou hlášku.
Celý úkol je cca hodina práce pro začátečníka, podstatou je zvládnout práci se souborem a jeho parserování. Půlku lze doslova obšlehnout z rc skriptů prakticky libovolné linuxové distribuce.
Tazatel celý semestr spinkal a teď má pocit, že to nedává. Za půl roku už to zase zapomene, a takový člověk je do praxe k ničemu.
ja sice nie som bash zaciatocnik, ale hodina by mi bola asi malo. predsalen ti zabere cas aj nejake to testovanie a vypiplanie :).
ak dotycny aj spal, tak by mu nemalo robit problem urobit to. staci google a trochu rozmyslat. bash je dost pouzivany a na vsetko najde clovek na nete navody, snippety atd. Aj keby mu to trvalo cely den, tak si to postupne posklada.
prosím vás pomožte mi, já už začínám bejt dost zoufalej :/
ses v haji, rovnou to vzdej :D
ahoj, ja tu ulohu tiez robim, musime to odovzdat do polnoci, ako ti to ide?
To, co si dostal za ulohu spravit robi v Linuxe MidnightCommander (jeho interny editor), dokoca este lespie. Pamata si aj posledny editovany riadok z kazdeho suboru, ktory bol prostrednictvom neho editovany a nastavi kurzor na tento riadok. Vyskusaj obkukat ako to robi. Pouziva na to subory s historiou, kde ma ulozene commandy a dalsie veci.
Vyber argumenov v skriptoch riesim takto: