Magaz, The Greek Linux Magazine
Magaz Logo

Μαθήματα bash No2

Βαγγέλης Παπαδογιαννάκης papas@rocketmail.com
Νοέμβριος 1998

Σ' αυτό το τεύχος, θα εξετάσουμε τους ειδικούς χαρακτήρες στο Bash...

Στο Bash, (γενικότερα, σε όλα τα shells) υπάρχουν διάφοροι χαρακτήρες ή ακολουθίες χαρακτήρων, που δεν είναι (άμεσα τουλάχιστον) προσπελάσιμοι από το shell. Αυτοί είναι:

  • > Επαναδρομoλόγηση εξόδου, πχ: echo "hello root" > message φτιάχνει το αρχείο με όνομα message που περιέχει το hello root
  • < Επαναδρομoλόγηση εισόδου, πχ: mail root < message, στέλνει στον root το message.
  • | Σωλήνωση πχ: ls | more χρησιμοποιεί την more στα αποτελέσματα της ls
  • & Εκτέλεση εντολής στο παρασκήνιο. Ακολουθεί εξήγηση παρακάτω...
  • ; Χωρίζει εντολές στην ίδια γραμμή, πχ: clear ; ls καθαρίζει την οθόνη και δείχνει τα αρχεία του τρέχοντος καταλόγου.

'Εστω οτι θέλουμε να βρούμε ένα αρχείο στο δίσκο μας. Ένας τρόπος είναι να χρησιμοποιήσουμε την εντολή 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.


  • Αν εκτελείτε πολές εργασίες στο παρασκήνιο, μπορείτε να τις δείτε όλες, γράφοντας jobs.
  • Για να σταματήσετε για λίγο μια εργασία παρασκηνίου, γράψτε: stop n, όπου n ο αριθμός αυτής της εργασίας.
  • Για να τερματίσετε μια εργασία παρασκηνίου, γράψτε kill n, όπου n ο αριθμός αυτής της εργασίας.
  • Για να περιμένετε να τελειώσουν οι δουλειές παρασκηνίου, γράψτε wait.
  • Πολλές φορές, οι εργασίες παρασκηνίου γράφουν στην οθόνη, κάτι πολύ ενοχλητικό. Για να σταματήσουν όταν πάνε να γράψουν στην οθόνη, γράψτε stty tostop

Άλλοι χαρακτήρες που το 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, και εξέταση των μεταβλητών περιβάλλοντος.


Valid HTML 4.01!   Valid CSS!