2 din 2
2
Un utilitar “must have”!
  [ Ignoră ]   [ # 16 ]
Avatar
RankRankRankRank
Administrator
Din: The Colony, TX
Macuser din: 11.10.05

Lectia 2: piping

Piping - posibilitatea ca datele de iesire a unui program sa fie redirectate ca date de intrare catre un alt program. Unul din principalele “selling-point-uri” ale UNIX-ului.
Primul t-shirt cu UNIX facut in 1976
http://www.mckusick.com/beastie/jpg/foglio.jpg
arata un Computer PDP11 la care Daemonii Unix-ului au grija de tzevile (Piping) care leaga diversele componente intre ele.
Echivalentul din Automator sunt sagetzelele care leaga actiunile intre ele.

Orice program unix are “Standard Input” - stdin - datele de intrare - ce ar primi de la tastatura si “Standard Output” - stdout - datele de iesire - ce ar scrie in mod normal pe ecran.
Pentru a “lega” 2 comenzi intre ele se foloseste (fireste) caracterul pipe | astfel: comanda1 | comanda2. Tot ce comanda1 ar fi scris pe ecran i se da comenzii2 ca si cum ar fi batut pe tastatura.
Alte caractere speciale folosite de piping sunt cele de redirectare > si <.

comanda1 > fisier va scrie in fisierul fisier tot ce ar fi pus in mod normal pe ecran. Asta se numeste redirectarea standard output-ului.

comanda1 < fisier va rula comanda1 avand ca intrare datele din fisier ca si cum ar fi batute de la tastatura. Asta se numeste (fireste) redirectarea standard input-ului.

In mod normal un > fisier va suprascrie fisierul fisier daca acesta exista. Daca dorim sa adaugam datele in continuare, trebuie folosit comanda1 >> fisier.

In continuare un mic shell script pentru facut un raport:

echo Raport Utilizare Disk Studentiraport.txt
date 
>> raport.txt
echo ======== >> raport.txt
for i in /Users/Student
 do
  echo -
n Avem utilizati in kb:
  
du -sk $i
  
echo -n numarul de fisiere din director fiind:
  
ls $i/ | wc -l
 done 
>> raport.txt
echo ======== >> raport.txt 

Explicatii:

comanda date afiseaza data curenta

du este Disk Usage - spatiul utilizat pe disk de catre fisierele/directoarele pasate ca parametrii. Optiunea -s ii spune sa arate doar un sumar (altfel pentru un director el spune marimile la toate subdirectoarele - recursiv) iar -k ii spune sa arate o valoare in Kb

wc este Word Count - numara litere, cuvinte & linii din datele primite la intrare. -l ii spune sa numere doar liniile. ls | wc -l numara cate linii intoarce comanda ls - adica cate fisiere sunt in directorul respectiv.

echo tipareste pe standard output ce i se da ca parametrii pe linia de comanda si pune un Enter la sfarsit. flag-ul -n il face sa nu mai puna Enter la sfarsitul liniei.

Alte chestii mici si utile:

cat date.txt sort date_sortate.txt 

Sortarea liniilor din fisierul date.txt in ordine alfabetica.

cat ia fisierul/ele primite pe linia de comanda si le scuipa pe standard output. Numele cat este o prescurtare de la conCATenate deoarece aceasta comanda se poate folosi pentru a concatena mai multe fisiere intre ele cat fila1 fila2 > filamare. Comanda de mai sus - pentru sortarea unui singur fisier - s-ar putea scrie si ca sort < date.txt > date_sortate.txt dar pentru mai multe fisiere gen cat date1.txt date2.txt date3.txt | sort > date_agragate_sortate.txt trebuie folosit cat

sort sorteaza smile ce vine pe stdin catre stdout. Implicit in ordine alfabetica dar se poate modifica cu flag-uri. Cum ar fi -n sa sorteze considerand ca prima coloana sunt numere (adica 3 inaintea lui 11 nu invers cum ar fi in ordine alfabetica) si -r ca sa sorteze in revers (de la z la a, 9 la 0)

du -sk * | sort -rn head -

Afiseaza primele 5 cele mai mari fisiere sau directoare din directorul curent si marimea lor in kb.

head si tail afiseaza primele sau ultimele 10 linii dintr-un fisier primit ca parametru sau din stdin daca nu primeste nici un fisier ca parametru pe linia de comanda. Flag-ul -numar afiseaza atatea linii in loc de 10. tail poate fi folosit pentru a vedea coada unui fisier care creste in timp real - cum ar fi log-ul de apache. dai un tail -f access_log intr-un terminal si vezi in timp real cine iti acceseaza serverul de web.

ls -more
 
sau -
ls -less 

Afiseaza pagina cu pagina o lista detaliata cu fisierele din directorul curent.

more afiseaza pe terminalul curent un fisier primit ca parametru sau stdin-ul pagina cu pagina - apasand Space - pentru citirea mai usoara.
less este versiunea GNU a lui more. less is more than more. Este mai destept ca more in sensul ca te poti “plimba” cu cursoarele sus/jos/stanga/dreapta nu doar pagina cu pagina.

Un ultim utilitar folosit pentru piping este putin cunoscutul tee - similar cu un racord T la o instalatie sanitara.

du -sk * | sort -rn tee sizes.txt head -

Tee-ul va “scurge” datele de pe parcurs (adica lista completa cu toate marimile fisierelor) in fisierul sizes.txt, el trimitand tot ce vine pe stdin catre stdout dar facand o copie si in fisier.

Exista foarte multe utilitare mici si frumoase care fac lucruri utile cu stream-urile de date (un stream de date este ce circula printr-un pipe) si va voi prezenta cateva din ele in lectiile ce urmeaza.

 Semnătură 

Apple:5x macmini (G4, 2007, 2009, 2010, 2012)
UNIX:IBM 7011-250/AIX 5.1, HP Jornada 680/JLime, HP 9000 F20/HP-UX 11.11
PC:PentiumD/Debian, HP t5300/Debian
Misc:Spectrum 48k, 8x Raspberry Pi, 2x CHIP

Profil
 
  [ Ignoră ]   [ # 17 ]
Avatar
RankRankRank
Member
Din: Galati
Macuser din: 14.10.05

Sergiulica, sorry dar nu numai ca n-am priceput nimic raspberry dar m-a bagat total in ceata. Clar nu e pentru mine - eu prefer Clix sau cum ii zice, eventual automator - adica Visual.
Oricum interesant expozeu - probabil ca pe unii ii ajuta.

.....

 Semnătură 

Pretul este evident negociabil.

Apple user!

Profil
 
  [ Ignoră ]   [ # 18 ]
Avatar
RankRankRankRank
Administrator
Din: The Colony, TX
Macuser din: 11.10.05

deschide un Terminal si incearca. Nu iti fie frica smile
ls (LiSt) e prima comanda cate trebuie sa o dai. Sau ls -l (echivalentul lui DIR din dos)
cu cd (Change Directory) te plimbi prin directoare.
cu pwd (Print Working Directory) aflii in ce director te aflii in acel moment.
Daca nu stii sa faci ceva - intreaba aicea si t-i se va raspunde smile

 Semnătură 

Apple:5x macmini (G4, 2007, 2009, 2010, 2012)
UNIX:IBM 7011-250/AIX 5.1, HP Jornada 680/JLime, HP 9000 F20/HP-UX 11.11
PC:PentiumD/Debian, HP t5300/Debian
Misc:Spectrum 48k, 8x Raspberry Pi, 2x CHIP

Profil
 
  [ Ignoră ]   [ # 19 ]
Avatar
RankRankRank
Member
Din: Bucuresti
Macuser din: 11.10.05

Toata treaba asta cu command line-ul are o curba de invatare foarte abrupta.

Din pacate folosirea command line-ului la modul expus de psergiu tine de programare (un soi de limbaj de programare de nivel foarte inalt cu sintaxa groaznica si reguli lipsa) si ca atare e cvasi imposibil de inteles pentru cei care n-au facut programare.
In definitiv, care e diferenta intre:

dirhandle opendir("/tmp/gigi")
while(
dirstruct readdir(dirhandle))
{
    
/fa ceva cu dirstruct.filename

si

for i in *.mp3
do
  
#fa ceva cu $i
done 

grin


c

Profil
 
  [ Ignoră ]   [ # 20 ]
Avatar
RankRankRank
Member
Din: Galati
Macuser din: 14.10.05

Sunt la lucru si din pacate pe PC - ca astia n-au auzit de OSX si Mac - asa ca ...

Sory pentru oftopic

psergiu - 28 Decembrie 2005 07:04 PM

deschide un Terminal si incearca. Nu iti fie frica smile
ls (LiSt) e prima comanda cate trebuie sa o dai. Sau ls -l (echivalentul lui DIR din dos)
cu cd (Change Directory) te plimbi prin directoare.
cu pwd (Print Working Directory) aflii in ce director te aflii in acel moment.
Daca nu stii sa faci ceva - intreaba aicea si t-i se va raspunde smile

 Semnătură 

Pretul este evident negociabil.

Apple user!

Profil
 
  [ Ignoră ]   [ # 21 ]
Avatar
RankRankRankRank
Administrator
Din: The Colony, TX
Macuser din: 11.10.05

Diciu: in shell script e scris mai frumos smile

costas: http://cygwin.com/setup.exe

 Semnătură 

Apple:5x macmini (G4, 2007, 2009, 2010, 2012)
UNIX:IBM 7011-250/AIX 5.1, HP Jornada 680/JLime, HP 9000 F20/HP-UX 11.11
PC:PentiumD/Debian, HP t5300/Debian
Misc:Spectrum 48k, 8x Raspberry Pi, 2x CHIP

Profil
 
  [ Ignoră ]   [ # 22 ]
Avatar
RankRankRankRank
Administrator
Din: The Colony, TX
Macuser din: 11.10.05

Pana acuma am primit un singur feed-back si acela semi negativ la ce am scris. Este cineva interesat sa continui explicatiile ?

 Semnătură 

Apple:5x macmini (G4, 2007, 2009, 2010, 2012)
UNIX:IBM 7011-250/AIX 5.1, HP Jornada 680/JLime, HP 9000 F20/HP-UX 11.11
PC:PentiumD/Debian, HP t5300/Debian
Misc:Spectrum 48k, 8x Raspberry Pi, 2x CHIP

Profil
 
  [ Ignoră ]   [ # 23 ]
Avatar
RankRankRankRank
Administrator
Din: bucurești
Macuser din: 11.10.05

poate la un topic specializat - programare, de exemplu…

Profil
 
  [ Ignoră ]   [ # 24 ]
Avatar
RankRankRankRank
Sr. Member
Din: Buchenland
Macuser din: 06.09.05

Eu sunt interesat. Terminalul e un loc prin care nu prea m-am bagat, in afara de ls -l, cd, rm si chestii dintr-astea usurele… asa ca as vrea sa aflu mai multe, dar n-as vrea sa-l pun pe Sergiu sa faca meditatii numai cu mine smile sper sa mai fie si altii interesati.

 Semnătură 

⌘-N

Profil
 
  [ Ignoră ]   [ # 25 ]
Avatar
RankRankRankRank
Administrator
Din: județul Devon, UK
Macuser din: 18.10.05
psergiu - 29 Decembrie 2005 10:20 PM

Este cineva interesat sa continui explicatiile ?

Parerea mea este ca articole de genul asta sunt necesare, dar in cadrul forumului isi dilueaza valoarea. La fel ca si inceputul de “prelegere” despre televiziunea HD, mai bine ar fi sa fie scrise de la cap la coada de autor, pus pe site undeva (la Tips & Tricks, poate) si cine are nevoie se uita acolo.
Mie unuia imi plac si imi par necesare chestiile astea. (Pe de alta parte, daca pot sa fac cu Automatorul… nici nu ma ating de Terminal… dar nu mi-e frica de el !)

Profil
 
  [ Ignoră ]   [ # 26 ]
Rank
Newbie
Din: Radauti, Suceava
Macuser din: 16.12.05

A aparut o carte excelenta pe tema aceasta la Peachpit Press, se numeste “Mac OS X UNIX 101 Byte-Sized Projects
By Adrian Mayo “; cine o doreste, PM me!

Profil
 
  [ Ignoră ]   [ # 27 ]
Avatar
RankRankRankRank
Administrator
Din: The Colony, TX
Macuser din: 11.10.05

Lectia 2.1: Here Documents

Ce ne facem daca un program vrea date de intrare pe stdin dar noi vrem sa i le dam “automat” - de exemplu daca ai de sortat 3 cuvinte care le ai in niste variabile de sistem. Solutia numarul 1 este: le scriem intr-un fisier temporar, dam fisierul ca stdin programului sort si dupa aia stergem fisierul. Complicat.
Solutian nr. 2: here files - se foloseste <<
sintaxa este
program << CUVANT
date
date
...
date
CUVANT

Ideea e ca tot ce este intre <<CUVANT si CUVANT (care poate fi orice cuvant, de obicei se foloseste “EOF”) i se da program-ului ca stdin.
Asta este util de exemplu pentru rulat din Terminal o comanda Apple Script mai complexa.
cu osascript -e “comanda” se pot rula cele de o singura linie - dar cand ai de rulat ceva de mai multe linii faci asa:

AppleVolume=3
osascript 
<< EOF
set volume ${AppleVolume}
tell application 
"iTunes"
 
activate
 next track
 play
end tell
EOF 

Da, puteti folosi variabile de shell in blocurile de Here-Documents si vor fi inlocuite cu valorile lor inainte de rulare.
Deci puteti face simplu ceva in genul:

#!/bin/sh
DUHOME=`du -ks /Users/*`
osascript << EOF
tell application 
"Finder"
activate
display dialog 
"Spatiu utilizat in /Users:
$DUHOMEbuttons "OK"
end tell
EOF 

editati-l cu TextEdit si salvati-l in home ca script.command
apoi din terminal: chmod a+x script.sh
acuma puteti sa doubleclick pe el din Finder.

 Semnătură 

Apple:5x macmini (G4, 2007, 2009, 2010, 2012)
UNIX:IBM 7011-250/AIX 5.1, HP Jornada 680/JLime, HP 9000 F20/HP-UX 11.11
PC:PentiumD/Debian, HP t5300/Debian
Misc:Spectrum 48k, 8x Raspberry Pi, 2x CHIP

Profil
 
   
2 din 2
2