Wednesday 13 August 2008

Κέλυφος για αρχάριους

Bash for beginners

To bash είναι ένα κέλυφος, όπως το csh, tcsh, zsh, ksh και άλλα. Είναι το προεπιλεγμένο κέλυφος για το ubuntu. To κέλυφος παρέχει ένα τρόπο επικοινωνίας του χρήστη με το λειτουργικό, είτε ενεργά (interactively) ή παθητικά (non-interactively). Ενεργά σημαίνει ότι οι εντολές εισάγονται από το πληκτρολόγιο από το χρήστη ενώ παθητικά εννοούμε ότι οι εντολές εκτελούνται από ένα αρχείο.

Αν μια εντολή ξεκινάει με # τότε θεωρείται από το bash ως σχόλιο και αγνοείται. Οι εντολές μπορούν να χωριστούν χονδρικά σε τεσσερις κατηγορίες:

* Απλές εντολές
* Αγωγοί (pipelines)
* Λίστες
* Σύνθετες εντολές

Οι απλές εντολές είναι ακολουθία λέξεων και κενών, όπως
cd ~/Documents
Oι αγωγοί | διοχετεύουν το αποτέλεσμα της πρώτης εντολής στη δεύτερη
ls | grep myfile
Οι λίστες είναι ακολουθία εντολών που εκτελούνται η μία μετά την άλλη
cd ~/Documents; ls; cd
Οι σύνθετες εντολές περιλαμβάνουν βρόγχους και εντολές ελέγχου.

Το κέλυφος μπορεί να χρησιμοποιηθεί σαν μια αυτόνομη γλώσσα προγραμματισμού μιας και περιέχει όλα τα χαρακτηριστικά όπως πρόσθεση, πολλαπλασιασμός, βρόγχους, στοιχεία ελέγχου κ.α. που απαιτεί μια γλώσσα προγραμματισμού. Η εκτέλεση ενός προγράμματος κελύφους, ας πούμε του αρχείου myscript, γίνεται ως εξής:
bash myscript
Για ευκολία μπορούμε να εισάγουμε ως πρώτη γραμμή του αρχείου myscript τη γραμμή:
#!/bin/bash
και να αλλάξουμε τα δικαιώματα του αρχείου σε εκτελέσιμο
chmod u+x myscript
Tώρα μπορούμε να το εκτελέσουμε και ως
./myscript
Στην περίπτωση αυτή το # δεν λειτουργεί ως σχόλιο, η μόνη εξαίρεση, αλλά σε συνδυασμό με τo ! δηλώνει ότι πρόκειται για πρόγραμμα κέλυφους bash.

To κλασσικό παράδειγμα "Hallo World" στους προγραμματιστές θα φαίνοταν στο bash:
#!/bin/bash
echo Hallo World
που τυπώνει απλώς στην οθονη το "Hallo World".

Όπως στις περισσότερες γλώσσες προγραμματισμού υπάρχουν οι έννοιες τυπική έξοδος (stdout), τυπική είσοδος (stdin), τυπικό λάθος (stderr). Η τυπική έξοδος και το τυπικό λάθος είναι συνήθως η οθόνη, ενώ η τυπική είσοδος το πληκτρολόγιο. Μπορούμε όμως να αναδιοχετεύσουμε όλα αυτά.

* stdout σε αρχείο
ls -l > result1.txt
Το αποτέλεσμα της εντολής ls-l αποθηκεύεται στο αρχείο result1.txt.
ls -l >> result1.txt
Εδώ τo αποτέλεσμα της εντολής ls -l θα αποθηκευτεί στο αρχείο result1.txt. Αν υπάρχει το αρχείο τότε θα γραφεί στο τέλος του αρχείου χωρις να διαγράψει τα προηγούμενα.

* stderr σε αρχείο
cd blah 2> err.txt
cd blah >& err.txt
Διοχετεύει το λάθος μήνυμα, σε περιπτωση που δεν υπάρχει ο φάκελος blah, στο αρχείο err.txt.

Στα προγράμματα κελύφους είναι πολύ εύκολο να διαβάσουμε τα ορίσματα του προγράμματος με τις μεταβλητές $0, $1, $2, ..., οι οποίες δηλώνουν το όνομα του προγράμματος με$0 και επειτα το πρώτο, δεύτερο όρισμα κ.ο.κ. To παρακάτω πρόγραμμα τυπώνει στην οθόνη το όνομα του προγράμματος (του αρχείου) και το πρώτο όρισμα.

#!/bin/bash
echo $0, $1

No comments: