Απλά μαθήματα Bash μέρος 1ο.
Description: This is issue 08 of Magaz, the Hellenic LinuxMagazine
Keywords: magaz hellenic greek hellas greece hellug linux magazine

Magaz, The Greek Linux Magazine
Τεύχος #08
Περιληπτικά Περιεχόμενα Αναλυτικά Περιεχόμενα Mirrors Links Πληροφορίες Συντάκτες Αναζήτηση Επικοινωνία
# Απλά μαθήματα Bash μέρος 1ο. Βαγγέλης Παπαδογιαννάκης papas@rocketmail.com Οκτώβριος 1998 Γεια και χαρά και καλό Φθινόπωρο. Πάλι ήρθε το μελαγχολικό... Από αυτή τη στήλη, θα προσπαθούμε να μάθουμε διάφορα κολπάκια για να κάνουμε τη ζωή μας με το αγαπημένο μας λειτουργικό ακόμα καλύτερη (Χμμμ, μάλλον ευκολότερη θα ήταν η σωστή λέξη). Αρχίζοντας από αυτό το μήνα, θα παρουσιάσουμε κάποια shell scripts, (σα να λέμε batch files) έτσι ώστε να αυτοματοποιήσουμε κάποιες καθημερινές ενέργειες, και να κάνουμε ορισμένες δουλειές γρηγορότερα. Α, δεν έχετε ιδέα από shell scripts ε; Καλά, θα σας τα εξηγήσω όλα... Ας αρχίσουμε με κάτι απλό... ΚΟΛΠΑΚΙ Νο1!!! Πρώτα από όλα, να γλιτώσουμε χώρο στο δίσκο μας. Αν και με τις σημερινές χωρητικότητες δεν πιστεύω να υπάρχει τέτοιο πρόβλημα, εντούτοις μερικές φορές είναι απαραίτητο. Ξέρετε πόσο πολύ χώρο πιάνει το /usr/doc μαζί με τα παρελκόμενά του; Πολύ. Για αυτό θα κάνουμε το εξής: θα συμπιέσουμε το κάθε αρχείο ξεχωριστά με το gzip, και θα φτιάξουμε ένα shell script που θα το διαβάζει συμπιεσμένο. Με αυτό τον τρόπο γλιτώνουμε πολύ χώρο στο δίσκο μας. Κατ αρχάς, να τα συμπιέσουμε. Δεν νομίζω να πιστεύατε ότι θα δίδαμε την εντολή gzip για κάθε αρχείο ξεχωριστά! Και για αυτό θα χρησιμοποιήσουμε script (Μετά θα σας πω και ένα μυστικό). Γράφουμε λοιπόν:
    #!/bin/bash
    DIR_NAMES=`ls -F|grep /`
    for n in $DIR_NAMES
    do
        echo "compressing $n..."
        cd `pwd`/$n;gzip *;cd ..
    done
ΠΡΟΣΟΧΗ! (2): το ` που βλέπετε, είναι η βαρεία (αυτό που είναι μαζί με την περισπωμένη, δίπλα στο πλήκτρο "1"...) 1. Δίδουμε στην μεταβλητή DIR_NAMES την τιμή της εντολής "ls -F|grep /". Δηλαδή, τα αποτελέσματα της ls που περιέχουν το σύμβολο / (δηλαδή είναι directory) 2. Στη συνέχεια μεταφερόμαστε σε κάθε ένα από τα directoryαυτά, και κάνουμε gzip όλα τα αρχεία (τα συμπιέζουμε δηλαδή). Φυσικά, αυτό θα γίνει για ένα επίπεδο directories. Σώστε το αρχείο με όνομα πχ zipdir. Κάντε το εκτελέσιμο με chmod 755 tardir, χώστε το κάπου που να είναι στο path. (πχ /usr/bin) Μετακινηθείτε στο /usr/doc δίνοντας cd /usr/doc και καλέστε το script γράφοντας το όνομα με το οποίο το έχετε σώσει. Για καθένα από τα directories, θα γίνει συμπίεση των περιεχομένων τους. ΚΑΛΟ? (Τώρα θα σας πω το μυστικό. Δεν ήταν ανάγκη να γράψετε το script αυτό, το gzip μπορεί κάνει το ίδιο πράγμα, δίνοντας του την παράμετρο --recurcive. Βρισκόμενοι δηλαδή στο /usr/doc, θα μπορούσαμε να γράψουμε: gzip -r * Και μη με ρωτήσει κανείς γιατί το κάναμε... Μάθαμε τα εξής, πολύ χρήσιμα, για τα shell scripts: Για να δώσουμε σε μια μεταβλητή το αποτέλεσμα μιας (ή και περισσότερων εντολών) χρησιμοποιούμε την/τις εντολή/ες ανάμεσα σε βαρείες... Μάθαμε την έννοια της pipe (|). Με την pipe, δρομολογούμε την έξοδο της εντολής που είναι αριστερά του pipe στην εντολή που είναι δεξιά του pipe. Δίνουμε, δηλαδή, σαν όρισμα στην εντολή grep το αποτέλεσμα της εντολής "ls -F". Στη συνέχεια η grep το "φιλτράρει" και, τελικά, αναθέτουμε στην μεταβλητή DIR_NAMES το αποτέλεσμα... Απλό ε? Στο linux, μπορούμε να "κολλήσουμε" διάφορα, με αποτέλεσμα το σύνολο να αποτελεί ένα όρισμα. Στην περίπτωσή μας, κολλήσαμε το αποτέλεσμα της pwd (print working dir) με τη μεταβλητή n (αυτή που παίρνει τις διάφορες τιμές των directories), και με την cd, μεταφερόμαστε κάθε φορά μέσα και έξω από το κάθε subdirectory του /usr/doc. Καλά όλα αυτά, αλλά έτσι και χρειαστεί να το διαβάσουμε το άτιμο αυτό το doc του τάδε πακέτου, τι κάνουμε; Να λοιπόν άλλο ένα script:
    #!/bin/bash
    gunzip $1 | less
Σώστε το αρχείο με όνομα πχ showdoc. Κάντε το εκτελέσιμο με chmod 755 showdoc, και στη συνέχεια χώστε το κάπου που να είναι στο path. (πχ /usr/bin) Για να δείτε ένα gziped doc, γράψτε στο directory του:
    showdoc "όνομα_του_doc_που_θέλετε_να_διαβάσετε"
Τι μάθαμε εδώ; Πως χρησιμοποιούμε τις παραμέτρους του χρήστη. Αυτό το $1, λέει στην gunzip να αποσυμπιέσει το αρχείο στο οποίο αναφέρεται η πρώτη λέξη (χωριζόμενη με κενά) που γράψατε μετά το κάλεσμα του script. Στη συγκεκριμένη περίπτωση, αφού έχουμε γράψει: showdoc "όνομα_του_doc_που_θέλετε_να_διαβάσετε" το bash θα ερμηνεύσει το $1 με το "όνομα_του_doc_που_θέλετε_να_διαβάσετε". Φυσικά, μπορούμε να ελέγξουμε και τυχόν άλλες εισαγωγές του χρήστη, με τα $2, $3, $4 κ.λπ. Λοιπόν, τελικά να δείτε που δεν χρειάζεται να το κάνετε ούτε αυτό... Εννοώ να συμπιέσετε τα README. Το πολύ να γλιτώσετε 200 ΚΒ, όσα DOC και να έχετε!!! Μη νομίζετε όμως ότι σας δουλεύω, η μάθηση είναι πολύ πιο εύκολη όταν συνοδεύεται από παραδείγματα!! ΚΟΛΠΑΚΙ Νο2!!! Δοκιμάστε να δείτε τι έχετε μέσα στο /usr/bin. 'Αμα έχετε δέκα οθόνες τη μια πάνω από την άλλη (και βρείτε τρόπο να τις συνδέσετε), ίσως και να χωρέσουν τα αρχεία που υπάρχουν εκεί μέσα. 'Ελα μου όμως που είσαστε καινούριοι στο Linux, και δεν ξέρετε τι εκτελέσιμα υπάρχουν εκεί... (μην παρεξηγηθείτε, ούτε οι περισσότεροι τα ξέρουν όλα). Πώς θα τα δείτε; ε; Ρωτώ λοιπόν... Πώς; ε; Πώς;;; Γράψτε στη γραμμή εντολών:
    ls -1 > ti_exo_edo_kai_den_to_ksero
Να δείτε ότι θα δημιουργηθεί ένα αρχείο που θα λέγεται "ti_exo_edo_kai_den_to_ksero" και θα περιέχει τα αρχεία, όπως αυτά θα προέρχονταν από την ls -1 (το -1 είναι για να εμφανίσει ένα αρχείο ανά γραμμή). Με το σύμβολο ">" λοιπόν, κάνουμε επαναδρομολόγηση της εξόδου (Μα καλά, ώρες-ώρες οι λέξεις αυτές με συναρπάζουν...). Εκεί που ήταν το αποτέλεσμα της ls -1 να τυπωθεί στην οθόνη, αυτό γράφτηκε στο αρχείο "ti_exo_edo_kai_den_to_ksero". Θα μου πείτε "σιγά μωρέ, αυτο το κάνω και με τη less ή τη e...". Έχετε δίκιο λοιπόν, και για αυτό το λόγo θα σας δώσω μερικά πιο καλά παραδείγματα... Redirect output (έτσι λέγεται αυτό το επαναδρομολόγηση της εξόδου) μπορούμε να κάνουμε ακόμα και σε συσκευές του συστήματός μας. Πχ, η εντολή:
    echo "Look at your printer" > /dev/lp1
θα στείλει στην lp1 (αυτό είναι, συνήθως, ο printer σας) το "Look at your printer". Αντίστοιχα, η εντολή
    cat README > lp1
θα στείλει στον Printer σας το αρχείο README (φροντίστε να είναι σε μορφή ASCII). Για όλα αυτά τα ωραία, πρέπει: Nα υπάρχει εκτυπωτής Να είναι αναμμένος Να είναι συνδεμένος στο PC Να είναι ONLINE Να έχει χαρτί Να έχει μελάνι (αν είναι inkjet), toner (αν είναι laser), μελανοταινία (αν είναι dot-matrix) Να μην είναι χαλασμένος. Αν δεν έχετε εκτυπωτή, μάλλον δε θα μπορέσετε να τυπώσετε, άρα μην το κάνετε. Για εσάς έχω άλλο κολπάκι... ΚΟΛΠΑΚΙ ΓΙΑ ΟΣΟΥΣ ΔΕΝ ΕΧΟΥΝ ΕΚΤΥΠΩΤΗ: 'Οσοι από εσάς δεν έχουν εκτυπωτή, έχουν Μodem, διαφορετικά πως βλέπετε αυτές τις αράδες; Ε; ('Εκτός φυσικά αν σας τα έφεραν τυπωμένα. Σε αυτή την περίπτωση χρησιμοποιήστε των εκτυπωτή που τα τύπωσε για το προηγούμενο κολπάκι) Αφού μετά από όριμη σκέψη ανακαλύψαμε ότι έχετε Modem, γράψτε:
    echo "ATX3DT090835398" > /dev/ttyS2
(ttyS0=com1, ttyS1=com2, ttyS3=com3 κ.ο.κ. ανάλογα που είναι το modem σας). Ο υπολογιστής σας θα καλέσει τον αριθμό 090835398 (αν υπάρχει), και θα μιλάει για σας με το μέντιουμ που βρίσκεται σε αυτή την HotLine (Σε αυτό το σημείο να αναφέρω ότι ο συντάκτης, αλλά και ο εκδότης του παρόντος, δεν αναλαμβάνουν οποιαδήποτε ευθύνη για κακή χρήση του κόλπου αυτού, με λίγα λόγια δηλαδή δεν πληρώνουμε εμείς τον λογαριασμό του ΟΤΕ σας). Καλύτερα λοιπόν να βάλετε ένα αστικό νούμερο. Αν το δοκιμάσετε, το Modem σας θα καλέσει αυτό τον αριθμό. Για να κλείσετε τη γραμμή δώστε:
    echo "ATΗ" > /dev/ttyS2
(ttyS0=com1, ttyS1=com2, ttyS3=com3 κ.ο.κ. ανάλογα που είναι το modem σας). Η γραμμή θα κλείσει. Αυτά τα ολίγα προς το παρόν... Τον επόμενο μήνα θα έχουμε πιο προχωρημένα πράγματα...