Εισαγωγή στο Bash: Ροές και pipes

dimitris | Τετ, 08/21/2013 - 17:20 | 18' | 3

Επεξηγούμε πως μπορείτε να ‘εξαπολύσετε’ όλη την δύναμη της γραμμής εντολών.
 

H πλατφόρμα του Linux εξελίσσεται μέρα με την μέρα σε μια ισχυρή desktop λύση. Δεν θα πρέπει όμως να ξεχνάμε, πως η γραμμή εντολών υπάρχει ακόμα.

Μπορεί να μην είναι το ίδιο όμορφη με ένα GUI αλλά υπάρχουν πολλές περιπτώσεις που θα σας γλύτωνε από πολύ κόπο και χρόνο.

Για παράδειγμα, μπορείτε να χρησιμοποιήσετε την γραμμή εντολών για να σώσετε και να εκτελέσετε πάλι μεγάλα κομμάτια εντολών, ή να δημιουργήσετε καινούργια για να εκτελεστούν όλα μαζί.

Το καλό με την γραμμή εντολών είναι πως δεν χρειάζεται να είναι κανείς "γκουρού" για να την χρησιμοποιήσει. Ακόμα και οι τελικοί χρήστες μπορούν να την χρησιμοποιήσουν βρίσκοντας το χρήσιμο και διασκεδαστικό, το να γράφουν εντολές με αυτό τον τρόπο.

Γιατί όμως να μπείτε στον κόπο; Αντίθετα στο GUI όπου μπορείτε να κάνετε κλικ σε κουμπιά τα οποία άλλοι υπέθεσαν πως χρειάζεστε, μπορείτε να δημιουργήσετε τις δικές σας εντολές φέρνοντας το σύστημα στα μέτρα σας.

Για παράδειγμα, θέλατε ποτέ να εκτελέσετε πολλές εντολές με όσο το δυνατόν λιγότερη χρήση του ποντικιού ; Εάν ναι, καλωσορίσατε στο κέλυφος. Μπορείτε επίσης να σκεφθείτε την διαδικασία εκκίνησης, η οποία έχει να κάνει με μια αλυσίδα εντολών που εκτελείτε σε μια σειρά ορισμένη με ακρίβεια και μπορεί να παραμετροποιηθεί σε μεγάλο βαθμό, εάν γνωρίζετε πως.

Για του λόγου το αληθές, δεν υπάρχει κάτι που σας σταματά να έχετε τα καλύτερα στοιχεία και από τους δύο κόσμους. Μίας και ένα script δουλέψει στην γραμμή εντολών, μπορεί να ενωθεί με ένα GUI εικονίδιο στο desktop ή μια επιλογή στο μενού σας.

Από την άλλη, πώς γίνετε να κάνετε ανάκτηση ενός χαλασμένου συστήματος μέσω GUI – που κάνετε κλικ εάν χρειάζεται να εγκαταστήσετε πάλι τον X server ;

Στο εσωτερικό του κελύφους

Όλες οι πληκτρολογήσεις εντολών συμβαίνει μέσα σε αυτό που ονομάζετε στην Χώρα του Unix, ως κέλυφος.

Αυτό είναι και μια γλώσσα προγραμματισμού και ένας διερμηνέας εντολών παρέχοντας ένα interface για το λειτουργικό σύστημα.

Κάθε κέλυφος περιέχει δομές ελέγχου ροής (flow control), χειρισμό μεταβλητών και μπορεί να τροποποιηθεί ώστε να ταιριάζει με το περιβάλλον στο οποίο εκτελούνται προγράμματα – πολλές φορές όμως αυτό γίνετε με διαφορετικούς τρόπους.

Υπάρχουν εκατοντάδες κελύφη διαθέσιμα στο Linux, αλλά πιθανότατα να έχετε μόνο μερικά από αυτά εγκατεστημένα. Για να βρείτε ποια από αυτά υπάρχουν στο σύστημα σας, δώστε την παρακάτω εντολή:

$ cat /etc/shells

Το Bash (Bourne-Again Shell, μία προσαρμογή του αρχικού κελύφους Bourne, αρχικά γραμμένο από τον Stephen Bourne της AT&T) είναι η πιο κοινή επιλογή στα Linux συστήματα. Ένα άλλο εξίσου δημοφιλές είναι το csh (C Shell), με σύνταξη περισσότερο όμοια της γλώσσας προγραμματισμού C. Το tcsh είναι μια βελτιωμένη, αντιστρόφως συμβατή έκδοση του csh. O λόγος για τον οποίον υπάρχει παραπάνω από μία λύση για το ίδιο πρόβλημα είναι ο σύνηθες: τα διάφορα κελύφη συνήθως έχουν διαφορετικές άδειες και κάθε ένα είναι βελτιστοποιημένο για κάπως διαφορετικές χρήσεις.

Τα προγράμματα που έχουν γραφτεί σε γλώσσα κελύφους ή σε οποιαδήποτε άλλη interpreted γλώσσα (π.χ. Python) συνήθως ονομάζονται scripts ή ελληνιστί σκριπτάκια. Είναι απλά αρχεία κειμένου που περιέχουν εντολές. Τα scripts φορτώνονται και εκτελούνται από τον διερμηνέα γραμμή προς γραμμή όπως θα γινόταν εάν θα πληκτρολογούσατε στην ίδια σειρά τις εντολές στην γραμμή εντολών. Επιπρόσθετα, δεν υπάρχει κάτι το οποίο μπορείτε να βάλετε σε ένα πρόγραμμα κελύφους που να μην μπορείτε να το πληκτρολογήσετε κατευθείαν στην γραμμή εντολών και τανάπαλι.

Είναι τα scripts καλύτερα ή χειρότερα από τα κοινά εκτελέσιμα μεταγλωττισμένα προγράμματα ; Όχι, απλώς είναι διαφορετικά.

Τα μεταγλωττισμένα προγράμματα είναι γρηγορότερα αλλά χρειάζεται περισσότερος χρόνος για να φτιαχτούν και να ελεγχθούν. Τα scripts από την άλλη, υλοποιούνται πολύ πιο γρηγορότερα, αλλά είναι πιο αργά από άποψη εκτέλεσης. Το σημαντικότερο όλων το οποίο πρέπει να εκτιμηθεί ανά περίπτωση είναι πως ο συνολικός χρόνος που ξοδεύεται στο γράψιμο και στην εκτέλεση του προγράμματος ελαχιστοποιείται. Σε πρακτικό επίπεδο, τα scripts κελύφους συνήθως είναι η καλύτερη λύση για τις προσωπικές ανάγκες σε σπιτικούς η εταιρικούς υπολογιστές που χρειάζονται αυτοματοποιημένη συντήρηση.

Προγράμματα και λέξεις-κλειδιά

Τα προγράμματα είναι ειδικά δυαδικά αρχεία που είναι αποθηκευμένα στον σκληρό σας δίσκο. Οποιοδήποτε κέλυφος μπορεί να τα εκτελέσει κατευθείαν . Τα κελύφη επίσης έχουν ένα σύνολο από εγγενή λέξεων-κλειδιά, ή εντολές που δεν αντιστοιχούν σε κάποιο πραγματικό πρόγραμμα.

Αυτό μπορεί να προκαλέσει σύγχυση την πρώτη φορά που θα μελετήσετε ένα script οπότε να το έχετε υπόψη σας.

Τα εκτελέσιμα προγράμματα που είναι ορατά από το κέλυφος, είναι αυτά που βρίσκονται στους καταλόγους που ορίζει η PATH περιβαλλοντική μεταβλητή. Στο μηχάνημα μου, η τιμή της PATH είναι:

[dimitris@polaris dimitris]$ echo $PATH
/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/X11/bin:/usr/lib/jre/bin:/home/dimitris/bin:/usr/lib/jre/bin

H εντολή echo είναι εγγενή λέξη-κλειδί: το κέλυφος θα εκτελέσει την αντίστοιχη λειτουργία, η οποία μεταφέρει στο τερματικό τα περιεχόμενα της PATH μεταβλητής, από μόνο του.

Για να γλυτώνουν χρόνο στον χρήστη πολλά κελύφη υλοποιούν ‘συμπλήρωση εντολών’. Για να το δείτε αυτό στην πράξη, απλώς πληκτρολογήστε σε ένα τερματικό την λέξη ‘fin’ και μετά πιέστε το Tab. Το κέλυφος θα ανιχνεύσει την λέξη που δώσατε σε όλα τα εκτελέσιμα προγράμματα που υπάρχουν στην $PATH, θα ανακαλύψει πως μόνο το πρόγραμμα ‘find’ ταιριάζει με αυτό που δώσατε και θα το συμπληρώσει μόνο του στην γραμμή εντολών. Το ίδιο συμβαίνει εάν δώσετε ατελή κατάλογο ή όνομα αρχείου.

Ροές και διασωληνώσεις (pipes)

Τώρα που ξέρουμε γιατί βρισκόμαστε μέσα σε ένα κέλυφος το επόμενο πράγμα που θα πρέπει να κατανοήσουμε είναι πως τα δεδομένα ρέουν μέσα έξω και διαμέσου του κελύφους. Κάθε πρόγραμμα που εκτελείτε στο κέλυφος μπορεί να χαρακτηριστεί ως ένα ‘μαύρο κουτί’ με 3 default ροές ή θύρες: την τυπική είσοδος (STDIN), την τυπική έξοδο (STDOUT) και τυπικό σφάλμα (STDERR).

Η STDIN είναι το μέρος από όπου προέρχεται όλη η εισαγωγή: για παράδειγμα, είναι το μέρος όπου ο πυρήνας προωθεί τα πλήκτρα που πιέζετε στο πληκτρολόγιο σας.

Η STDOUT είναι το μέρος όπου το πρόγραμμα στέλνει όλα τα bytes που παράγει: αναφορές, υπολογισμοί, κλπ. Η STDERR είναι η γραμμή ‘επείγουσας ανάγκης’ που στέλνονται τα μηνύματα λάθους.

Αυτό που κάνει την αρχιτεκτονική τόσο ισχυρή είναι το γεγονός πως όλες οι θύρες των διαφορετικών προγραμμάτων μπορούν εύκολα να συνδεθούν μεταξύ τους ή σε αρχεία στον σκληρό σας δίσκο, δημιουργώντας με την μία ένα μοναδικό εικονικό πρόγραμμα με εντυπωσιακές δυνατότητες.

Ας το επιδείξουμε αυτό, προσποιώντας πως ο σκληρός σας δίσκος είναι γεμάτος. Για να κάνουμε χώρο, θα πρέπει να βρούμε τα 50 μεγαλύτερα αρχεία στον κατάλογο home, να τα εμφανίσουμε σε ένα τερματικό παράθυρο και να σώσουμε την λίστα σε ένα τοπικό αρχείο.

Ερευνώντας μετέπειτα την λίστα θα μπορούμε να αποφασίσουμε ποια αρχεία μπορούν να διαγραφούν. Η εντολή για να πραγματοποιηθεί αυτό είναι η εξής:

find . –type f –exec ls –s {}\; | sort –n –r | head -50 | cat –n | tee /tmp/bigfiles.list

Αρκετά μακριά εντολή ε; Μην ανησυχείτε – θα γίνει αρκετά λογική μίας την καταλάβετε!.

Το πρώτο πράγμα που πρέπει να κατανοήσετε είναι ο ρόλος του ‘|’ χαρακτήρα, γνωστός σε αυτή την περίπτωση ως ‘σωλήνας’ ή pipe.

Αυτό που κάνει – είναι να συνδέει την STDOUT ροή του προηγούμενου προγράμματος κατευθείαν στην STDIN της επόμενης. Για να καταλάβετε τι γίνετε θα πρέπει να παρουσιάσουμε ορισμένα utilities – επιλέγοντας αυτά που είναι ακρως πρακτικά για τον χρήστη.

Για να ακολουθήσετε την διεργασία, ελέγξτε τις παραπάνω εντολές στο μηχάνημα σας, προσθέτοντας μία ενότητα κάθε φορά. Ξεκινήστε με το να πληκτρολογήσετε τα πάντα μέχρι το πρώτο | (μην το συμπεριλάβετε όμως). Μετά πληκτρολογήστε ξανά (ή καλέστε τα με το πάνω βελάκι), προσθέτοντας όλα μέχρι το δεύτερο | , πατήστε Enter και σημειώστε τι συνέβη. Συνεχίστε μέχρι το τέλος της γραμμής.

Το πρόγραμμα find βρίσκει όλα τα αρχεία που ταιριάζουν σε ορισμένα κριτήρια και, εάν ζητηθεί εκτελεί (exec) σε κάθε ένα από αυτά, συμβολισμένα με τα {}, την εντολή μεταξύ του exec διακόπτη και του ελληνικού ερωτηματικού. Η τελεία μετά από την εντολή find αντιπροσωπεύει τον τρέχον κατάλογο, ο οποίος θα μπορούσε να αντικατασταθεί με οποιοδήποτε άλλο. Το ‘-type f’ σημαίνει, λάβε υπόψη μόνο αντικείμενα τύπου ‘αρχείο’. To ls είναι σύντμηση του list: o διακόπτης –s ορίζει να επιστραφεί ως αποτέλεσμα το όνομα αρχείου, ακολουθούμενο από το μέγεθος του σε bytes. Επομένως το πρώτο κομμάτι της εντολής, θα παράγει μια αταξινόμητη λίστα μεγεθών αρχείων και ονομάτων, ένα ανά γραμμή, χωρίς να παίζει ρόλο πόσο ‘χωμένα’ είναι στο δέντρο καταλόγων.

Η εντολή sort ταξινομεί τα αρχεία σε ανεστραμμένη (“-r”) αριθμητική (“-n”) σειρά. H head εντολή θα επαναλάβει μόνο τις πρώτες 50 γραμμές της input ροής, απορρίπτοντας όλες τις υπόλοιπες και η “cat –n” θα προσθέσει έναν αριθμό γραμμής σε ότι θα λάβει. Στην μέση αυτών των θεότρελων υδραυλικών η tee θα δημιουργήσει ένα παρακλάδι: η τυπική έξοδος θα εκτυπωθεί στο παράθυρο του τερματικού (επειδή είναι η τελευταία εντολή αλλά και θα αποθηκευτεί στο αρχείο /tmp/bigfiles.list

Αυτάκια και άλλα..

Τις μεταβλητές σε script κελύφους τις αναγνωρίζετε από το σήμα του δολαρίου πριν από μια εντολή. Αυτές μπορούν να διαβαστούν, να οριστούν με τιμές με αρκετά δημιουργικούς τρόπους χάρης των πολλών αστείων χαρακτήρων που μοιάζουν με ‘αυτάκια’ που βρίσκονται διάσπαρτα στο πληκτρολόγιο σας. Τα διάφορα στιλ παράθεσης είναι πολύ σημαντικά για το κέλυφος διότι το κάθε ένα από αυτά διερμηνεύετε διαφορετικά. Τα μονά αυτάκια ('αυτά εδώ') μεταφράζονται με κυριολεκτικό τρόπο. Όλο τους το περιεχόμενο είναι αυτό που φαίνεται, ένα στατικό κομμάτι κειμένου. Τα διπλά αυτάκια ("αυτά") χρησιμοποιούνται για να εκτελέσουν τις λεγόμενες 'αντιμεταθέσεις μεταβλητών'. Πριν χρησιμοποιηθεί το περιεχόμενο τους, το κέλυφος θα το ανιχνεύσει για τυχόν μεταβλητές, αναγνωρισμένες από το σήμα δολαρίου και θα αντικαταστήσει την τρέχον τιμή με αυτή που περιέχετε μέσα στα αυτάκια.

Ο τελευταίος τύπος quotes, (`τα ανεστραμμένα`) είναι αυτά με την μεγαλύτερη δύναμη – για αυτό και θα πρέπει να χρησιμοποιούνται με προσοχή. Το περιεχόμενο τους είναι μια εντολή προς εκτέλεση. Το αποτέλεσμα αυτής της εντολής μετέπειτα τοποθετείτε για τιμή στο αρχικό string – δοκιμάστε να εκτελέσετε την εντολή ls $HOME μέσα στους τρεις τύπους των quotes!

 

FIND…

Έξοδος:

9950 Projects/Rules/slideshow.sxw

1300 Projects/Rule/Backup/june_2013.tar.bz2

Πολλά αρχεία εδώ..

 

SORT…

Έξοδος:

13000 Projects/Rule/Backup/june_2013.tar.bz2

Projects/Rule/slideshow.sxw

Ίδιο όπως το παραπάνω, ταξινομημένα αριθμητικά.

 

HEAD…

Έξοδος

13000 Projects/Rule/Backup/june_2013.tar.bz2

Projects/Rule/slideshow.sxw

Μόνο οι 50 πρώτες γραμμές εμφανίζονται εδώ..

 

CAT…

Έξοδος

1 13000 Projects/Rule/Backup/june_2013.tar.bz2

2 9950 Projects/Rule/slideshow.sxw

Όπως παραπάνω αλλά αριθμημένα.

 

TEE…

Ίδια έξοδος όπως και στα παραπάνω αλλά στέλνετε ταυτόχρονα …

Στην οθόνη

Στο αρχείο /tmp/bigfiles.list

 

 

Προγραμματισμός σε Bash:

Αν θέλετε να μάθετε περισσότερα για προγραμματισμό σε Bash διαβάστε τους παρακάτω οδηγούς:

Εισαγωγή στο Bash: Ροές και pipes

Bash: Βρόχος επανάληψης σε εύρος αριθμών όπου μεταβλητές ορίζουν την αρχή ή το τέλος

Bash: Πως εκτελούμε μια εντολή Χ φορές στη σειρά με την for

Bash: Κωδικοί εξόδου και έλεγχος ροής

Scripting: Όταν το GUI δέν επαρκεί

Bash: Επεξεργασία κειμένου με Regular Expressions και άλλα κόλπα

Για μία γενική εισαγωγή της γραμμής εντολών, ένα πολύ καλό tutorial είναι το Learning the Bash Shell του C Newham και Β Rosenblatt εκδόσεις O’Reilly.

 

 

 

Δώσε αστέρια!

MO: 4 (ψήφοι: 4)

Σχόλια

Καλό άρθρο, να σημειώσω σχετικά με τα ανεστραμένα quotes (``) κάνει καλύτερα και πιο αξιόπιστα η σύνταξη $(), εννοώντας πώς μού 'χει τύχει σε αρκετά σκριπτάκια που γράφω το $() να δουλέψει εγγυημένα, το `` όχι πάντα.

το $() είναι bash-ισμός. Δηλαδή δεν το έχουν ως χαρακτηριστικό όλοι οι bourn-οειδείς φλοιοί (αλλά το έχει το bash που είναι ο κυρίαρχος φλοιός στο λίνουξ και σε άλλα συστήματα). Εφόσον χρησιμοποιείται το bash τότε θεωρείται πολύ καλύτερη σύνταξη (συνδυάζεται καλύτερα με τα εισαγωγικά). Διαφορετικά είναι αναγκαίες οι βαρείες. http://linuxmint.gr/index.php?topic=1954.0 http://linuxmint.gr/index.php?topic=1946.msg17339#msg17339