Shell BASH - konfiguracne subory, echo, uvod do premennych

15.01.2007 16:15 | patie

po dlhej (polrocnej? hehehe) odmlke som sa znovu dostal k tomuto serialu a napisal som dalsiu cast. verim ze uz to pojde rychlejsie :D v tejto casti si povieme nieco o bash konfiguracnych suboroch,nejakych jednoduchych nastaveniach a pozreme sa na premenne..

v konfguracnych suboroch BASHu su ulozene premenne prostredia.. (bodka pred subormi znamena ze subor je skryty.. to je snad jasne)

/etc/profile je citany pri logovani ako prvy a obsahuje globalne nastavenia pre vsetkych

.bash_profile vykona sa zakazdym pri prihlasovani usera (takze lokalne nastavenia).. tento subor je najcastejsie preferovany a sluzi pre individualne nastavenia alebo zmeny defaultnych nastaveni..

.bash_login ma tu istu funkciu a vykonava sa v pripade ze .bash_profile neexistuje (synonymum .bash_profile)

.profile ak neexistuju popredne dva tak sa pouzije tento (synonymum .bash_profile)

.bash_logout pri vylogovani

.bashrc sa pouziva v takzvanom "non-login shelli"..

.bash_history
historia prikazov zadavanych userkom.. vdaka tomu mozme napriklad pomocou prikazu history vypisat poslednych x prikazov (priklad history 5.. vypise 5 posledne vykonanych prikazov) kurzorov hore/dole rychlo pozret/vyuzit skor pouzity prikaz... toto vsak je nie vzdy vyhodne a preto ak potrebujeme rovno spustit prikaz priamo z historie pouzijeme vykricnik ! a za nim cislo riadku na ktorom je v historii prikaz napr. !74 :) ale da sa to pouzit tiez velmi zaujimavo nejako takto !vyraz - namiesto slova vyraz dosadime hladany vyraz napriklad !ps nam moze najst v historii ps aux a ten spusti. existuju tiez finticky ako !! ktory spusti predchadzajuci prikaz.. pomocou premennych HISTFILE a HISTSIZE mozme nastavit nazov suboru do ktoreho sa loguje a jeho max. velkost.. o premennych vsak zachvilu.. vo vacsine
distribucii je HISTSIZE nastavena na hodnotu 1000 co pre nas znamena ze nam to zaloguje poslednych 1000 vykonanych prikazov...

.bashrc a etc/bashrc
sem sa davaju rozne uzivatelske nastavenia, aliasi, funkcie... /etc/bashrc je logicky globalne nastavenie (pre vsetkych juzrov) a .bashrc v adresari juzra lokalne..

echo

dostavame sa k prvemu prikazu a tym je echo.
echo nam vypisuje na standardny vystup dane. Vyskusat si to mozme na primitivnom priklade

echo pokus

(nie, nie hello world :)), tymto by sme mali dosiahnut vypisanie slova pokus. Mozme to skusit aj s viac parametrami (slovami), echo to v pohode zvlada :> napriklad

echo moj bash pokus

iste vam uz je jasne ze dostaneme: moj bash pokus.

ak chceme aby bolo viac vyrazov spojenych do jedneho argumentu pouzijeme " " alebo ' '.

prikaz echo ma aj 3 podstatne prepinace (switche,flagy.. kazdy to vola inac)
-n hovori o tom ze na koniec riadku sa neprida znak novy riadok. (defaultne echo pridava na koniec tento znak)
-e aby echo rozumelo specialnym znakom (naopak -E zakaze specialne znaky)

specialne znaky:
\e – znak escape
\n – novy riadok
\t - horizontalny tab
\v - vertikalny tab
\\ - opacne lomitko (backslash)

to su aspon niektore zakladne.. dalsie si mozte lahko pozriet man echo

mala ukazka...

echo -e "datum\ttodo\n15.1\tnapisat tuto cast serialu\n17.1\tbla bla bla :P"

spravy nam to "tabulku", keby sme vsak puzili -E tak sa nepouziju specialne znaky a dostaneme to co je v uvodzovkach. dufam ze je to dost jasne :) ...a ideme dalej

premenne

premenne su velmi dolezitou sucastou bashu (ako aj inych jazykov).. je to vlastne akasi schranka s nazvom ktora prechovava hodnotu. premenne by sme si mohli rozdelit na shellove, specialne(definovane systemom) a premenne uzivatelske/programov(premenne v shell skriptoch..)

v BASHi je dobrym zvykom pisat nazvy premennych VELKYMI pismenami.

nejake tie shellove premmenne na ukazku...

BASH=/bin/bash - cesta k bashu
BASH_VERSION='3.1.17(2)-release' - verzia daneho shellu...
COLUMNS=80 - sirka terminalu v znakoch
HISTFILE=/home/patoman/.bash_history - subor kam sa loguje historia o ktorej sme hovorili vyssie
HISTFILESIZE=500
HISTSIZE=500
HOME=/home/patoman - domovsky adresar
HOSTNAME=mojserver.sk - hostname masiny
LINES=24 - pocet riadkov terminalu
PS1='\u@\h:\w\$ ' - nastavenie prompt-u... povieme si o tom blizsie neskor
PWD=/home/patoman
SHELL=/bin/bash - cesta k nasmu shellu
USER=patoman

je tu este jedna velmi dolezita systemova premenna PATH kam sa shell pozera v pripade ze ma vykonat nejaky externy prikaz/program a nebola mu zadefinovana ina cesta. (cesty oddelujeme : dvojbodkou). takze ak spustame nejaky program a nezadame k nemu cestu system hlada program v tychto cestach, ak nenajde vypluvne to na nas
staru znamu hlasku command not found. na nieco podobne sluzi CDPATH ktory vsak nehlada subory ale adresare. v podstate sluzi na zjednodusenie prace s prikazom cd...

ak by sme radi vediet hodnotu danej premennej staci poznat jej nazov.. napr. chcete juknut na hodnotu premennej HISTFILE postaci:

echo $HISTFILE

resp mozte pozriet cez env na vsetky systemove premenne.

nejake tie specialne premenne...

$# - pocet parametrov poslanych k programu
$0 - nazov programu sameho
$1,$2,$3 ... - dalsie parametre...
#? - kod ukoncenia programu

uzivatelske premenne

su vlastne premenne definovane v nasich skriptoch.. o tom ze to je schranka s nazvom prechovavajuca hodnotu sme si uz povedali vyssie. premenne v bashi su case sensitive (tzn. rozlisuje velke a male pismena, SERVER nieje to iste co SeRvEr...), v bashi tiez netreba definovat typ premennej (ako napriklad v cecku int,char...)

syntax: PREMENNA=hodnota

priklad:

CISLO=1337
PREDMET="laptop"

do premennych sa odvolavame pomocou znaku $, napriklad:

echo $PREDMET

hodnoty premennych mozme jednoducho doplnat alebo prepisovat. prepisanie funguje presne tak ako v pripade

tvorenia/naplnania premennej. doplnat mozme jednoduchou fintou:

VETA="dobry den"
echo $VETA
VETA="$VETA ti prajem"
echo $VETA

toto sa da naozaj rozne kombinovat.. predvediem este jeden uplne jednoduchy priklad, neskor to bude mat

samozrejme dolezitejsi vyznam.

MENO=MICHAL
VEK=29
VETA="$MENO ma $VEK rokov."
echo $VETA

prikazom unset vyraz (namiesto vyraz - nazov premennej) zrusime danu premennu

pre tuto cast serialu je to vsetko, v dalsej casti si dokoncime premenne a pozrieme sa na aliasi...

    • len tak dalej ;) 18.01.2007 | 13:39
      Avatar betmen   Používateľ

      len tak dalej ;)
      ______________
      nález plný strát

      ______________ kam by som chodil...na dvor
    • errata 18.01.2007 | 13:53
      Avatar blackhole_ventYl   Používateľ

      1) nie je tam pri premennych spomenuty prikaz export, totizto ak si zadefinujes premennu napriklad takto

      PENIS = "velky"

      bude dostupna len v lokalnom scope skriptu, ale nepremietne sa do prostredia, cize nejaky skript spusteny z tohto skriptu o nej vediet nebude, ale ak pouzijes

      export PENIS = "velky"

      bude o nej prostredie vediet

      2) je tam sice spomenute, ze viacero parametrov sa moze spajat do jedineho pomocou "..." a '...', ale nie je spomenute, ze nahrada premennych (a wildcardov) sa vykona len v ramci "..." a obsah medzi '...' sa interpretuje AS-IS, cize preklad premennych sa nevykona

      3) v druhom bloku kodu odspodu mas chybu :)

      $VETA="dobry den"

      vygeneruje chybu bash: unknown command on line XY, znak $ na zaciatku je navyse ;)

      analogicky na tretom riadku.

      ale ja viem, casty preklep... :)

      inac ma ten serial celkom potencial, bash je mocny nastroj.

      ---
      Cuchat s nadchou, to je ako sniffovat bez promiscu.

      --- Cuchat s nadchou, to je ako sniffovat bez promiscu.
      • dikes 18.01.2007 | 13:58
        Avatar patie   Návštevník

        1. bude v dalsej casti serialu
        2. ano spravne v pripade '' sa obsah vypise presne tak ako je takze premenne sa neberu v uvahu
        3. opravene

        dik

        zivot je tazky - jeden z najtazsich
      • ventYl, tie tvoje priklady 18.01.2007 | 16:28
        faster   Návštevník

        ventYl, tie tvoje priklady fakt stoja za vsetky drobne :D

        ale serial sa paci aj mne, len tak dalej..

        --
        "To err is human, but to forgive is divine."

        • podla mna dnes kazdy muz 18.01.2007 | 23:10
          Avatar blackhole_ventYl   Používateľ

          podla mna dnes kazdy muz musi dat najavo svojmu okoliu, ze ma velky penis, preto

          export PENIS="velky"

          je klucovym prikazom kazdeho uspesneho muza :]

          ---
          Cuchat s nadchou, to je ako sniffovat bez promiscu.

          --- Cuchat s nadchou, to je ako sniffovat bez promiscu.
    • bash ? zase ?? 18.01.2007 | 21:33
      connectic   Návštevník
      dost ludi sa vyjadrilo zeby privitalo serial o bashi.. ech preco ? sak nie v pohode, ale imo je ich na CZSR nete uz dost linuxexpres.cz je tam docela rozsiahly serial, ktory vam vytvori slusne zaklady. chybaju mi tam ale komplexnejsie skripty. root.cz vela clankov ktore dokopy davaju nieco skutocne ucelene, aj ked je tam ista duplicita abclinuxu.cz podobne ako prvy spominany. niekolko dielny serial ktory je ale viac nahustenejsi +howto manualy atd... preto neviem ci je dobre omielat zaklady bashu dookola - stale to iste len inak podane. imo by bolo mozno zaujimavejsie vytvorit clanky ktorych obsah by tvorili rozpitvane skripty. mam na mysli rozne featury na monitorovanie systemu skripty crone atd. mozno by sa nakoniec pod clankom utvorila plodna diskusia ktora by obsahovala napady ako to ci ono zlepsit/skratit/urychlit. inak ocenujem tvoju snahu nieco napisat :)
      • re: 18.01.2007 | 21:44
        disorder   Návštevník

        > plodna diskusia ktora by obsahovala napady ako to ci ono zlepsit/skratit/urychlit.

        perl? :D

        ---
        Windows NT was supposed to hit Unix hard. It did - like a bug hitting a windshield.

    • jeej taky sexi clanok pre 19.01.2007 | 10:31
      Pistik   Návštevník

      jeej taky sexi clanok pre mladych haxorov treba viac :D very usefull ;)

    • chcem sa ospravedlnit, ze sa 31.01.2007 | 11:57
      Avatar patie   Návštevník

      chcem sa ospravedlnit, ze sa to znovu zacina natahovat ale mam skuskove.. novy diel vsak pride coskoro

      zivot je tazky - jeden z najtazsich

      zivot je tazky - jeden z najtazsich