Faceți căutări pe acest blog

sâmbătă, 17 decembrie 2011

Functii bash

  Tot am vorbit despre aliasuri (sinonime/ înlocuitoare de comenzi), să vedem ce mai putem face cu comenzile, cum ne putem simplifica viața în terminal, folosind funcțiile bash, funcții care se comportă în mod similar cu aliasurile, dar la un nivel superior! Adică cu ajutorul funcțiilor putem utiliza o serie de comenzi, nu una singură! Utilizând o funcție bash, putem ”stoca/ depozita” câteva comenzi în fișierul .bashrc, comenzi pe care le putem executa ulterior.
 Sintaxa unei funcții este în principiu simplă:
funcție () {
 comandă
}      (se poate scrie și: funcție () { comandă } )
 Comanda ”funcție” dată în terminal va executa de fapt comanda setată funcției, ”comandă”.
 Dacă comanda are mai multe argumente, acestea vor fi introduse între parantezele rotunde:
funcție (argument1,argument2,...,argumentN) {
 comandă
 }
iar comanda va fi apelată cu: funcție argument1 argument2 ... argumentN

 Haideți să vedem câteva exemple concrete:
 hello () { echo 'Hello world!' ; }              => tastând ”hello” (fără ghilimele...) în consolă va fi afișat mesajul: ”Hello world!”
 salut () { echo "Salut $1, ce faci?" ; }    => comanda ”salut dan”, va afișa in consolă textul ”Salut dan, ce faci?” (putem folosi după cum vedeți variabile: $1 este primul cuvânt de după comandă...).
  salut () { echo "Salut $USER, ce faci?" ; }   => comanda ”salut” va afișa textul ”Salut nume-utilizator, ce faci?”. Observați că textul ce urmează să fie afișat nu este încadrat între ' ci între " ? Motivul? Ambele tipuri de ghilimele ( ' și " ) se pot folosi la aliasuri și funcții, ambele indică interpretorului de comenzi Bash să ignore spațiile libere dintre cuvinte și să folosească stringul (șirul) ca un singur argument, dar ' va ignora caracterele speciale (cum ar fi variabilele $1/adică primul argument de după comandă, sau $USER/ adică userul logat în shell-ul curent), iar " va interpreta caracterele speciale! ' și " se comportă similar și la aliasuri...
 
 Sincer să fiu, eu sunt în acest stadiu, adică pot crea niște funcții simpliste... Dar puteți găsi pe internet tot felul de funcții utile, unele trebuie (eventual...) doar puțin adaptate.
 Spuneam că funcțiile fac același lucru ca și aliasurile. Să presupunem că dorim să avem un sinonim/ prescurtare/ înlocuitor pentru o comandă, de exemplu: ifconfig -a| grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}'. Comanda ifconfig setează sau dă informații despre o interfață network, dar noi vrem să aflăm doar adresa MAC, asta va face comanda anterioară, dar fiind destul de lungă și având ceva parametri putem seta un alias sau o funcție bash.
 Alias:   
alias mac="ifconfig -a| grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}'"
 Funcție:
macadd () {
ifconfig -a| grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}'
}

Dacă adăugăm aliasul sau funcția (sau și una și alta) în .bashrc și dăm în consolă comanda mac sau macadd, primim același output, și anume adresa MAC.


 După cum se poate observa, outputul e același, cu alias mac și type macadd putem vedea sintaxa aliasului și a funcției.

Să mergem mai departe, n-am uitat că am scris mai sus că o funcție poate executa mai multe comenzi. Știți (cred) cum puteți afla diverse informații despre mașina/ sistemul din dotare, uname -a, uptime, free -m, etc., dar cu siguranță e preferabil să facem economie de efort.
mach() {
    echo -e "\nMachine information:" ; uname -a
    echo -e "\nUsers logged on:" ; w -h
    echo -e "\nCurrent date :" ; date
    echo -e "\nMachine status :" ; uptime
    echo -e "\nMemory status :" ; free -m
    echo -e "\nFilesystem status :"; df -h
}

Plasați această funcție în .bashrc, reporniți consola (sau dați source .bashrc în consola deja deschisă) și dați comanda mach, e altă treabă, nu? În plus, puteți schimba unele din comenzi, sau puteți adăuga altele, sau elimina unele din ele.

 Începătorii nu prea cunosc tipul arhivelor de pe Linux, nu știu cum să le dezarhiveze, există mai multe tipuri, fiecare cu anumite comenzi, parametri, etc. Ce părere aveți de funcția următoare?
extract () {
   if [ -f $1 ] ; then
       case $1 in
        *.tar.bz2)      tar xvjf $1 && cd $(basename "$1" .tar.bz2) ;;
        *.tar.gz)       tar xvzf $1 && cd $(basename "$1" .tar.gz) ;;
        *.tar.xz)       tar Jxvf $1 && cd $(basename "$1" .tar.xz) ;;
        *.tar)          tar xvf $1 && cd $(basename "$1" .tar) ;;
        *.tbz2)         tar xvjf $1 && cd $(basename "$1" .tbz2) ;;
        *.tgz)          tar xvzf $1 && cd $(basename "$1" .tgz) ;;
        *.bz2)          bunzip2 $1 && cd $(basename "$1" /bz2) ;;
        *.rar)          unrar x $1 && cd $(basename "$1" .rar) ;;
        *.gz)           gunzip $1 && cd $(basename "$1" .gz) ;;
        *.zip)          unzip $1 && cd $(basename "$1" .zip) ;;
        *.Z)            uncompress $1 && cd $(basename "$1" .Z) ;;
        *.7z)           7z x $1 && cd $(basename "$1" .7z) ;;
        *)              echo "'$1' cannot be extracted via extract()" ;;
       esac
   else
       echo "'$1' is not a valid file!"
   fi
Indiferent de tipul arhivei pe care vrem s-o dezarhivăm, comanda extract nume-arhivă dată în terminal va ști cum să se descurce, chiar dacă arhiva e criptată (cu condiția să puneți parola corectă la cerere!). se poate observa că această funcție se descurcă cu 12 tipuri de arhive!

 Se vede cum funcția/ comanda crează directoarele necesare și extrage conținutul arhivei.

Tot felul de alte sarcini se pot realiza foarte simplu și comod folosind aliasuri sau funcții bash.

 Listare fișiere după extensie:
lsex() {
find . -type f -iname '*.'${1}'' -exec ls -l {} \; ;
}


 Listare directoare, după dimensiuni:
dirsize ()
{
du -shx * .[a-zA-Z0-9_]* 2> /dev/null | \
egrep '^ *[0-9.]*[MG]' | sort -n > /tmp/list
egrep '^ *[0-9.]*M' /tmp/list
egrep '^ *[0-9.]*G' /tmp/list
rm -rf /tmp/list
}


Căutare informații pe Wikipedia:
wiki() {
      dig +short txt $1.wp.dg.cx;
}


Aflare IP (pentru utilizatorii de lynx):
myip () {
lynx -dump http://checkip.dyndns.org:8245/
}


 Aflare IP (pentru utilizatorii de w3m):
myip1 () {
w3m -dump http://checkip.dyndns.org:8245/
}


 Calculator în terminal:
calc () {
 echo "$*" | bc -l;
}



 Din păcate nu pot preciza sursele de unde am luat aceste funcții, în principal din cauza faptului că sunt copiate de-a lungul timpului de pe diverse forumuri... Contribuția mea este doar modificarea (nesemnificativă aș zice...), a unora din ele.
 Cei ce vor să învețe câte ceva, se pot inspira de aici:
http://docs.securityorg.net/Bash.htm
 Important e faptul că folosirea aliasurilor și a funcțiilor bash vă poate schimba complet percepția asupra liniei de comandă... :D

Un comentariu:

Back to top