Βαγγέλης Παπαδογιαννάκης Νοε 1998
Σ' αυτό το τεύχος, θα εξετάσουμε τους ειδικούς χαρακτήρες στο Bash...
Στο Bash, (γενικότερα, σε όλα τα shells) υπάρχουν διάφοροι χαρακτήρες ή ακολουθίες χαρακτήρων, που δεν είναι (άμεσα τουλάχιστον) προσπελάσιμοι από το shell. Αυτοί είναι:
'Εστω οτι θέλουμε να βρούμε ένα αρχείο στο δίσκο μας. Ένας τρόπος είναι να χρησιμοποιήσουμε την εντολή find γράφοντας:\
find / -name filename -print
Αυτό, είναι κάπως αργό γιατί ψάχνει όλο το σύστημα. Καλό θα ήταν να είχαμε το shell ελεύθερο για άλλη δουλειά. Γράφοντας λοιπόν:
find / -name filename -print &
η εντολή αυτή θα εκτελεστεί στο παρασκήνιο, και θα έχουμε ελεύθερο το shell για όποια άλλη δουλειά θέλουμε.
Αν βρεθεί το αρχείο, θα το εμφανίσει στην οθόνη μας.
Έστω τώρα ότι έχουμε ανοίξει τον αγαπημένο μας editor, αλλά εκεί που γράφουμε κάτι, θέλουμε να δούμε μία διαδρομή στο δίσκο. Μπορούμε να κάνουμε suspend την εργασία αυτή (δηλαδή το edit του αρχείου), να βρούμε αυτό που θέλουμε, και να ξαναγυρίσουμε στον editor. Πως; Στο περιβάλλον του editor πατάμε ctrl-z. Ο editor θα σταματήσει, και θα μας βγάλει στο prompt. Εκεί μπορούμε να κάνουμε ότι θέλουμε. Για να επιστρέψουμε στον Editor, απλά γράφουμε fg.
Μα τι έγινε; Να σας εξηγήσω εγώ τι έγινε: Πατώντας ctrl-z, ο editor κατάληξε μια "σταματημένη δουλειά" (stopped job). Εξακολουθεί να υπάρχει, αλλά έχει σταματήσει στο παρασκήνιο (background), δεν εκτελείται, και περιμένει από εσάς να τον βάλετε να συνεχίσει να δουλεύει είτε στο προσκήνιο (foreground) γράφοντας fg είτε στο παρασκήνιο γράφοντας (πόσο ευπρόβλεπτο...) bg.
\
Άλλοι χαρακτήρες που το bash "εκτιμά" διαφορετικά είναι:\
[]:
Αυτοί περικλείουν ένα εύρος τιμών, ή διάφορες τιμές. πχ η εντολές:
ls [a-f]* εμφανίζει όλα τα αρχεία που έχουν πρώτο γράμμα από το a μέχρι το f. Οι ακολουθίες είναι σύμφωνα με τον κώδικα ASCII.
ls [f]* εμφανίζει όλα τα αρχεία που έχουν πρώτο γράμμα a ή f.
\
``:
Οποιαδήποτε ακολουθία μέσα στις "βαρείες", ερμηνεύεται από το shell σα να είναι εντολή. Δηλαδή:
echo "You are in "`pwd`"..." θα έχει ως αποτέλεσμα να σας γράψει στην οθόνη:
You are in "/usr/local/bin..." (αν τη στιγμή που τη γράψατε βρισκόσασταν στο /usr/local/bin, εντάξει;)
\
Είδαμε και τον χαρακτήρα \. Αυτός, είναι ο χαρακτήρας διαφυγής, δηλαδή ΟΤΙ (μα ότι) είναι μετά από αυτόν, εμφανίζεται ώς έχει (ακόμα και ο ίδιος, γράφοντας \\)
\
"":
Οτιδήποτε ανάμεσα σε δύο ", ερμηνεύεται ώς έχει, εκτός από:\
1. $: στον οποίο θα γίνει αντικατάσταση με τη μεταβλητή που ακολουθεί τον χαρακτήρα $
2. ``: ανάμεσα στους οποίους θα γίνει αντιστίχηση αποτελέσματος εντολής
3. \ Ο χαρακτήρας διαφυγής του οποίου τη χρησιμότητα αναφέραμε παραπάνω.
\
'':
Οτιδήποτε ανάμεσα σε δύο αποστρόφους, ερμηνεύεται ώς έχει, εκτός φυσικά, από άλλη αποστροφο.
Και επειδή ξέρω ότι στα παραδείγματα είσαστε καλύτεροι, ορίστε μερικά:
\
* echo "Καλά, δεν είναι "cool";;;"
Καλά, δεν είναι "cool";;;\
* echo 'Καλά, δεν είναι "cool";;;'
Καλά, δεν είναι "cool";;;\
* echo "You are in " `pwd` "..."
You are in " /usr/local/bin "\
* echo "Your \$PATH variable is set to: $PATH"
Your $PATH variable is set to: /usr/bin:/bin:....... (όποιο τελος πάντον είναι το PATH σας...)\
():
Ανάμεσα σε αυτούς τους χαρακτήρες, οι εντολές ομαδοποιούνται και είναι σα να τρέχουν σε ένα ξεχωριστό shell.
Δηλαδή, κατα κάποιο τρόπο γίνεται ομαδοποίηση και εξάγεται το συνολικό αποτέλεσμα. πχ:
(echo "user " ; whoami ; echo "logged in on ";date) >> logfile Αυτό γράφει στο αρχείο logfile το εξής:
user user logged in on date, όπου user ο χρήστης που μπήκε στο σύστημα, και date η ώρα-ημερομηνία εισαγωγής. Μια τέτοια εντολή καλό θα ήταν να υπήρχε στο /etc/profile, ώστε να κρατάμε σε ένα logfile τους επισκέπτες στο σύστημά μας ανα πάσα στιγμή. Μην φανταστείτε όμως ότι με αυτό τον τρόπο θα προστατευτείτε από τους παρείσακτους!!!
Στην παραπάνω εντολή, το >> είναι το append to file, δηλαδή δε σβήνει το προηγούμενο logfile, αλλά γράφει ότι είναι να γράψει στο τέλος του αρχείου. Δεν χάνουμε δηλαδή το προηγούμενο logfile.
\
Στο επόμενο τεύχος του Magaz, συνέχεια του Bash, και εξέταση των μεταβλητών περιβάλλοντος.\