Cum se execută o secvenţă de comenzi în unix

Created by Alin Brindusescu on 2011-02-21 03:36:59

Săptămîna trecută m-am contrazis cu un coleg de servici vis a vis de modul de executie al unei secvente de comenzi. Deoarece nu mi-am upgrade-at memoria la 64 de biti am fost nevoit să arunc o privire pe internet să văd dacă aveam dreptate, iar apoi am pus chestiile astea aici ca o extensie la sistemul meu de 32 de biti de memorie.

Care e diferenţa dintre:

 
# ./configure; make; make install
 
şi
 
# ./configure && make && make install
 
şi cînd să folosim prima respectiva a doua versiune.

Cînd folosim ; comenzile vor fi executate una după alta fără a ţine cont de rezultatul execuţiei comenzi anterioare. Dacă execuţia comenzi configure returnează o erroare make şi make install vor fi executate la rîndul lor. Deci, ; trebuie folosit într-o secvenţă de comenzi dacă toate comenzile trebuie executate indiferent de rezultatul execuţiei lor. Pentru exemplul de mai sus nu prea are sens folosirea ; deoarece dacă configure nu se execută cu success nu avem nici un motiv să continuăm cu executţia lui make.

Cînd folosim && comenzile vor fi executate una după alta dar dacă una din ele returnează un cod de erroare următoarele comenzi nu vor mai fi executate. Dacă execuţia comenzi configure returnează un code de eroare atunci make şi make install nu vor mai fi executate. Deci, && trebuie folosit într-o secvenţă de comenzi a căror execuţie trebuie să respecte o anumită logică. Pentru exemplul nostru există o logică în executarea comenzilor, deoarece dacă configure returnează un cod de eroare nu avem nici un motiv să continuăm cu execuţia lui make, sau dacă make nu se execută cu success nu avem nici un motiv să continuăm cu execuţia make install chiar dacă configure s-a executat cu success.

Pe lingă ; şi && există şi ||, acesta va executa comanda aflată în dreapta doar dăcă comanda aflată în stînga nu se execută cu sucess. De exemplu

 
# ./configure || echo "Configure Fail"
 
aici echo se execută doar dacă configure returnează o altă valoare decît zero.

Cei 3 operatori pot fi folosiţi împreună, dar e nevoie de puţină atenţie.
În următorul exemplu

 
# ./configure || echo "Configure Fail" ; cat error_log
 
comanda cat v-a fi executată doar în cazul în care comanda configure nu o sa se termine cu success.
Acum hai să adăugăm cat la secvenţa noastră de config make:
 
# ./configure && make && make install || cat error_log
 
În această nouă secvenţă dacăconfigure eşuează atunci cat va fi executată, dacă configure returnează succes şi make eşuează cat se va executa şi aşa mai departe. Dacă toate comenzile din stinga || returnează succes atunci cat nu se v-a executa.
Secvenţele de comenzi şi operatori logici pot fi grupate, pentru a forma fluxuri de excuţie mai complicate, cu ajutorul {} sau().
Cînd se folosesc {} pentru a grupa secveţa de comenzi, comenzile vor fi executate în "shell"-ul curent, iar cînd se folosesc() comenzile vor fi executate într-un sub-"shell".




Comments: work in progress!

Search

Ads