Menu
ΠΡΟΗΓ. ΚΕΦ.   ΕΠΟΜΕΝΟ ΚΕΦ.
Menu and Table of Contents

Εισαγωγή στη χρήση του κελύφους και σύνταξη εντολών

Χρήση Κελύφους - Τερματικό

Στο φαίνεται και πάλι η ιεραρχία σε ένα σύστημα UNIX. Ξεκινώντας από κάτω προς τα επάνω, φαίνεται ότι ο πυρήνας είναι το μόνο στοιχείο που επικοινωνεί με το υλικό του υπολογιστή. Οι εφαρμογές και τα κελύφη επικοινωνούν με τον πυρήνα, και τελικά μόνο μέσω αυτού μπορούν να κάνουν χρήση του υλικού. Οι χρήστες χρησιμοποιούν εφαρμογές οι οποίες προωθούν τις λειτουργίες τους προς τα κάτω. Το κέλυφος είναι στην πραγματικότητα μια εφαρμογή. Η μόνη, αλλά πολύ σημαντική, λειτουργία που έχει είναι να προωθεί τις εντολές των χρηστών προς τον πυρήνα. Οι εφαρμογές που μπορούν να χρησιμοποιήσουν οι χρήστες μπορεί να είναι είτε γραφικές, δηλαδή να λειτουργούν μέσα από γραφικό περιβάλλον (πχ: firefox, chrome, openOffice κτλ.), είτε να εκτελούνται μέσα από ένα τερματικό. Το κέλυφος είναι μια εφαρμογή χωρίς γραφική διεπιφάνεια χρήσης και εκτελείται μέσα σε ένα τερματικό.

Ιεραρχία στο UNIX
Σχήμα 1: Ιεραρχία στο UNIX.

Τερματικό

Τερματικό Terminal

Τερματικό είναι μια συσκευή με οθόνη και πληκτρολόγιο η οποία επικοινωνεί (μέσω μιας σειριακής θύρας) με κάποιον κεντρικό υπολογιστή. Μέχρι περίπου το 1990 οι χρήστες Unix χρησιμοποιούσαν σχεδόν αποκλειστικά τέτοιου τύπου τερματικές συσκευές. Σε έναν κεντρικό υπολογιστή ήταν συνδεδεμένες 10άδες τερματικά. Τα τερματικά δεν είχαν δική τους CPU, αλλά ήταν μόνο συσκευές αποτελούμενες από οθόνη και πληκτρολόγιο (όχι ποντίκι). Ό,τι πληκτρολογούσε ο χρήστης στο πληκτρολόγιο αποστέλλονταν μέσω της σειριακής επικοινωνίας στον κεντρικό υπολογιστή. Ό,τι "τύπωνε" ο κεντρικός υπολογιστής μεταφέρονταν μέσω της σειριακής στο τερματικό και το τερματικό το εμφάνιζε στην οθόνη. Στα Σχήματα και βλέπουμε δυο φωτογραφίες διαδεδομένων τερματικών της εποχής 1980-1990.

Τερματικό DEC-vt100
Σχήμα 1: Τερματικό DEC-vt100 (πηγή: https://de.wikipedia.org/wiki/VT100).
Τερματικό DEC-vt420
Σχήμα 1: Τερματικό DEC-vt420 (πηγή: https://en.wikipedia.org/wiki/VT420) .

Πλέον, προφανώς δεν υπάρχουν οι παραπάνω τερματικές συσκευές. Οι χρήστες χρησιμοποιούν ως σταθμούς εργασίας εξελιγμένους υπολογιστές οι οποίοι είναι ικανοί να χειριστούν γραφικά (παραθυρικά) περιβάλλοντα. Υπάρχουν, όμως, παραθυρικές εφαρμογές οι οποίες προσομοιώνουν τη λειτουργία ενός τερματικού. Στις εφαρμογές προσομοίωσης τερματικού, η βασική λειτουργία παραμένει η ίδια με του πραγματικού τερματικού, βέβαια υπάρχουν πλέον πολλές περισσότερες δυνατότητες. Στο φαίνεται μια τέτοια εφαρμογή η οποία ονομάζεται gnome-terminal και είναι ιδιαίτερα διαδεδομένη. Υπάρχουν πολλές διαφορετικές εφαρμογές προσομοίωσης τερματικού όπως οι konsole, rxvt, xfce4-terminal, xterm, putty και πολλές ακόμη [[1]].

Παραθυρικό Τερματικό
Σχήμα 1: Παραθυρικό Τερματικό.
Κέλυφος Shell

Το κέλυφος (shell)

Μέσα σε ένα τερματικό εκτελείται μια εφαρμογή που ονομάζεται κέλυφος (shell). Στην πραγματικότητα, προφανώς δεν εκτελείται το κέλυφος «μέσα» στο τερματικό, αλλά το κέλυφος εκτελείται από τον υπολογιστή. Γίνεται, όμως, η ρύθμιση το τερματικό να «στέλνει» τις εντολές που πληκτρολογούμε στο κέλυφος, και από την άλλη το κέλυφος να τυπώνει δεδομένα (μηνύματα) στο τερματικό. Επειδή όλα αυτά εμφανίζονται μέσα στο τερματικό, καταχρηστικά λέμε ότι το κέλυφος «στέλνει» μέσα στο τερματικό. Το κέλυφος είναι υπεύθυνο να διαβάσει από το τερματικό αυτά που πληκτρολογεί ο χρήστης, να τα ερμηνεύσει και να τα εκτελέσει. Όπως βλέπουμε στην λίστα που ακολουθεί, υπάρχουν πολλά διαφορετικά κελύφη:

Διερμηνευτής Interpreter Windows Command Prompt

Επίσης, ως κελύφη μπορούμε να θεωρήσουμε και τους διερμηνευτές εντολών (interpreters) γνωστών γλωσσών προγραμματισμού όπως την python, Ruby κ.ά. Τέλος, στο Λειτουργικό Σύστημα των Windows υπάρχει η εφαρμογή "Command Prompt" (cmd.exe), η οποία βέβαια έχει ιδιαίτερα περιορισμένες δυνατότητες, θα μπορούσαμε όμως να την ονομάσουμε κέλυφος από την άποψη ότι «διαβάζει» τις εντολές του χρήστη και τις μεταφέρει στο Λειτουργικό για εκτέλεση. Για να καλύψει η Microsoft την έλλειψη ενός δυναμικού κελύφους στο λειτουργικό της, ανέπτυξε το Windows PowerShell.

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

  1. Εμφάνιση της προτροπής (prompt). Είναι ένδειξη αναμονής του Λ.Σ. για την αναμονή εισαγωγής εντολής. Η προτροπή συνήθως είναι ο χαρακτήρας "$", ή μπορεί να περιέχει και άλλες πληροφορίες όπως "asidirop@aetos:~$". Στο παράδειγμα αυτό, συμπεριλαμβάνεται στην προτροπή η πληροφορία του ονόματος τρέχοντος χρήστη (asidirop), του ονόματος του υπολογιστή (aetos) και του τρέχοντος φακέλου εργασίας (~) .
  2. Λήψη και γραμματική ανάλυση της σύνταξης της εντολής,
  3. Εκτέλεση της διαδικασίας εισόδου και μετασχηματισμός της εντολής,
  4. Αρχικοποίηση των απαιτούμενων λειτουργιών,
  5. Αναμονή για ολοκλήρωση των λειτουργιών που είναι σε εξέλιξη (π.χ. αναμονή για τον τερματισμό του προγράμματος που εκτελείται, καθώς όσο εκτελείται ένα πρόγραμμα, «δεσμεύει» το τερματικό, δηλαδή διαβάζει από το πληκτρολόγιο και τυπώνει στην οθόνη του),
  6. Επαναφορά στο βήμα 1.
Διατύπωση εντολών

Διατύπωση εντολών

Η γενική σύνταξη μιας εντολής που αναγνωρίζει ένα shell είναι:

Όνομα_εντολής  ορίσματα

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

Επίσης, αρκετές εντολές δέχονται διαφόρων τύπων ορίσματα σε σχέση με τη χρήση τους. Έτσι, έχουμε ορίσματα που αντιστοιχούν σε ονόματα αρχείων και ορίσματα που αντιστοιχούν σε ενεργοποίηση λειτουργιών. Πολλές φορές τα τελευταία ονομάζονται σημαίες (flags).

Η πρώτη μου εντολή

Έστω η διατύπωση:

cat file1.txt

Η παραπάνω διατύπωση, για το κέλυφος σημαίνει:

Η λειτουργία της εντολής cat [] είναι η εμφάνιση των περιεχομένων ενός ή περισσότερων αρχείων. Με το παραπάνω θα εμφανιστούν στο τερματικό τα περιεχόμενα του αρχείου file1.txt. Η εντολή cat έχει νόημα να εκτελείται για να εμφανίσει αρχεία, των οποίων το περιεχόμενο μπορεί να εμφανιστεί μέσα σε ένα τερματικό, δηλαδή μόνο αρχεία απλού κειμένου. Τα αρχεία απλού κειμένου στα windows έχουν την κατάληξη .txt. Στο unix μπορούν να έχουν οποιαδήποτε κατάληξη (πολλές φορές και καμία κατάληξη). Εάν με την cat προσπαθήσουμε να εμφανίσουμε ένα αρχείο που δεν είναι αρχείο κειμένου, τότε θα εμφανιστούν στο τερματικό περίεργοι χαρακτήρες οι οποίοι αντιστοιχούν σε bytes που δεν είναι αναγνωρίσιμα σε κατάσταση κειμένου. Κάτι αντίστοιχο θα βλέπαμε αν ανοίγαμε μια εικόνα τύπου .png με τον κειμενογράφο notepad.

Καλή και κακή χρήση της cat
Σχήμα 1: Καλή και κακή χρήση της cat.
Αποτέλεσμα κακής χρήσης της cat
Σχήμα 1: Αποτέλεσμα κακής χρήσης της cat.

Στην εντολή cat μπορούμε να δώσουμε πολλά ονόματα αρχείων ως ορίσματα. Θα εμφανίσει τα περιεχόμενα όλων των αρχείων, το ένα μετά το άλλο χωρίς κάποιο διαχωριστικό ενδιάμεσα, όπως στο a παρακάτω.

Αποτέλεσμα της cat με 2 αρχεία ως ορίσματα
Σχήμα 1: Αποτέλεσμα της cat με 2 αρχεία ως ορίσματα.

Στην εντολή cat μπορούμε να δώσουμε και ορίσματα τύπου «σημαίας» (flag). Για παράδειγμα η σημαία "-n" έχει ως αποτέλεσμα να εμφανίσει η εντολή και αύξοντα αριθμό μπροστά από κάθε γραμμή (Βλέπε a).

Αποτέλεσμα της cat με 2 αρχεία ως ορίσματα και η σημαία "-n"
Σχήμα 1: Αποτέλεσμα της cat με 2 αρχεία ως ορίσματα και η σημαία "-n".
man (εντολή)

Η εντολή man

Ένας χρήστης δεν είναι δυνατό να θυμάται όλα τα δυνατά ορίσματα για όλες τις εντολές. Συνήθως θυμόμαστε μόνο αυτά που χρησιμοποιούμε πολύ συχνά. Θα πρέπει, λοιπόν, ο χρήστης να μπορεί να βρίσκει εύκολα τα ορίσματα που μπορεί να δεχθεί μια εντολή. Αυτό γίνεται χρησιμοποιώντας το εγχειρίδιο χρήσης (manual page) της εντολής. Το εγχειρίδιο χρήσης εμφανίζεται χρησιμοποιώντας την εντολή man. Η εντολή man [] δέχεται ως όρισμα το όνομα μιας εντολής και μας εμφανίζει το εγχειρίδιο χρήσης για την εντολή. Για παράδειγμα η εντολή:

man cat

θα εμφανίσει το εγχειρίδιο χρήσης της εντολής cat όπως στο a. Στο σχήμα, διακρίνονται τα στοιχεία με τίτλο "NAME", "SYNOPSIS" και "DESCRIPTION".

Το εγχειρίδιο χρήσης της εντολής cat
Σχήμα 1: Το εγχειρίδιο χρήσης της εντολής cat.
Τα συνήθη τμήματα ενός εγχειριδίου χρήσης είναι τα:

Η σειρά των παραπάνω, δηλώνει και την σπουδαιότητά τους. Η περιγραφή του τι κάνει η εντολή είναι το πλέον σημαντικό στοιχείο και ακολουθεί η σύνταξη της εντολής που περιγράφεται στο τμήμα "SYNOPSIS". Σε αυτό το τμήμα για την εντολή cat βλέπουμε την πληροφορία:

cat [OPTION]... [FILE]...

Εδώ πρέπει να εξηγήσουμε τα σύμβολα που εμφανίζονται στη σύνταξη:

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

cat -n -E file1.txt file2.txt

Σημαίνει:

Διαφοροποίηση Σημαιών και Αρχείων

Πώς, όμως, διαχωρίζει η εντολή cat (και οι υπόλοιπες εντολές που δέχονται παρόμοιους τύπους ορισμάτων) σε ποιο σημείο τελειώνουν τα ορίσματα τύπου σημαίας και σε ποιο σημείο ξεκινούν τα ορίσματα που εκφράζουν ονόματα αρχείων, δεδομένου ότι δεν υπάρχει κάποιο διαχωριστικό σύμβολο μεταξύ τους, και δεδομένου ότι όλα τα ορίσματα είναι προαιρετικά; Μήπως θα μπορούσαν να μην υπάρχουν καν ορίσματα τύπου Σημαίας;

Η απάντηση στο προηγούμενο ερώτημα είναι ότι ο διαχωρισμός των τύπων των ορισμάτων γίνεται με βάση το αν υπάρχει η παύλα (-) στην αρχή του ορίσματος. Μάλιστα σε κάποιες περιπτώσεις μπορεί να υπάρχει διπλή παύλα (--). Συνεπώς, η εντολή "cat" διαχωρίζει το "-Ε" και "καταλαβαίνει" ότι δεν εκφράζει όνομα αρχείου, εξαιτίας της παύλας με την οποία ξεκινάει η συμβολοσειρά (string) που αντιστοιχεί στο όρισμα.

Όταν τα ορίσματα τύπου σημαίας εκφράζονται με ένα γράμμα το καθένα, συνήθως οι εντολές επιτρέπουν την σύμπτυξη τους σε ένα όρισμα. Έτσι το:

cat -n -E file1.txt file2.txt
είναι ισοδύναμο ως προς το αποτέλεσμα με το:
cat -nE file1.txt file2.txt

Παρότι οι δυο παραπάνω εντολές είναι ισοδύναμες για το αποτέλεσμα, στην πρώτη περίπτωση έχουμε δώσει τέσσερα ορίσματα στην εντολή, τα δυο εκ των οποίων είναι σημαίες. Στη δεύτερη περίπτωση έχουμε δώσει τρία ορίσματα στην εντολή. Μόνο το πρώτο από αυτά (-nE) εκφράζει σημαία και μάλιστα αντιστοιχεί σε δυο σημαίες. Το αν υπάρχει αυτή η δυνατότητα για σύμπτυξη είναι θέμα της κάθε εντολής και όχι του κελύφους ή του λειτουργικού συστήματος. Υπάρχουν αρκετές εντολές που δεν επιτρέπουν σύμπτυξη στα ορίσματά τους.

Η εντολή ls [] εμφανίζει τα περιεχόμενα (αρχεία και υποκαταλόγους) του καταλόγου στον οποίο βρισκόμαστε (στο επόμενο κεφάλαιο θα δούμε περισσότερες λεπτομέρειες για αυτό). Μπορείτε να δείτε το εγχειρίδιο χρήσης της εντολής ls. Ένα παράδειγμα εκτέλεσης της εντολής είναι:

ls -l -a /tmp

Στο παραπάνω έχουμε δώσει τρία ορίσματα στην εντολή. Το πρώτο είναι το -l και είναι τύπου σημαίας. Το δεύτερο είναι το -a και είναι και αυτό τύπου σημαίας και το τρίτο είναι το /tmp το οποίο εκφράζει τον φάκελο του οποίου τα περιεχόμενα θα μας εμφανίσει η εντολή. Όταν τα ορίσματα είναι τύπου σημαίας και σηματοδοτούνται με έναν μόνο χαρακτήρα (πχ. a, l κτλ.), τότε οι περισσότερες εντολές υποστηρίζουν την σύμπτυξή τους. Έτσι η προηγούμενη εντολή είναι ισοδύναμη με την:

ls -la /tmp

Οι δυο προηγούμενες εντολές είναι ισοδύναμες ως προς το αποτέλεσμα. Όμως στην πρώτη περίπτωση έχουμε δώσει στην εντολή τρία ορίσματα, εκ των οποίων τα δυο πρώτα είναι τύπου σημαίας. Στη δεύτερη περίπτωση έχουμε δώσει στην εντολή δυο ορίσματα. Μόνο το πρώτο είναι τύπου σημαίας, αλλά εκφράζει δυο σημαίες, δηλαδή δυο οδηγίες προς την εντολή.

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

       -a, --all
              do not ignore entries starting with .

       -A, --almost-all
              do not list implied . and ..

       --author
              with -l, print the author of each file

       -b, --escape
              print C-style escapes for nongraphic characters

       --block-size=SIZE
              scale   sizes   by   SIZE   before   printing    them.     E.g.,
              `--block-size=M'  prints sizes in units of 1,048,576 bytes.  See
              SIZE format below.
       .......
       -r, --reverse
              reverse order while sorting
       .......

Στο παραπάνω βλέπουμε ότι υπάρχει το όρισμα --author, το οποίο οδηγεί την εντολή να εμφανίσει για κάθε αρχείο το όνομα του συγγραφέα. Επίσης, υπάρχει το όρισμα --all το οποίο δίνει την οδηγία για εμφάνιση και των κρυφών αρχείων. Το --all είναι ισοδύναμο με το -a. Στην πραγματικότητα το -a είναι συντόμευση του --all. Η συντόμευση αυτή υπάρχει επειδή πρόκειται για ένα πολύ συχνό όρισμα. Από την άλλη, για το --author δεν υπάρχει κάποια συντόμευση, επειδή δεν χρησιμοποιείται πολύ συχνά.

ls -ra
ls -r -a
ls --all --reverse
ls -a -r
ls --all -r
ls --reverse --all 

Οι παραπάνω χρήσεις της εντολής ls είναι απολύτως ισοδύναμες ως προς το αποτέλεσμα. Εδώ αξίζει να επισημάνουμε πως συνήθως τα ορίσματα τύπου σημαίας, όταν ακολουθούν μια παύλα, τότε είναι συντομεύσεις και η εντολή ερμηνεύει τον κάθε χαρακτήρα ξεχωριστά. Όταν υπάρχουν δυο παύλες, τότε ερμηνεύονται ως μια λέξη.

Πιθανά σφάλματα κατά τη διατύπωση εντολών

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

asidirop@dellpc:~/tmp/unix$ ls-l
ls-l: command not found
asidirop@dellpc:~/tmp/unix$ ls-l -a
ls-l: command not found
asidirop@dellpc:~/tmp/unix$ ls -l-a
ls: invalid option -- '-'
Try `ls --help' for more information.
asidirop@dellpc:~/tmp/unix$

Κατά την εκτέλεση των παραπάνω εντολών εμφανίζονται μηνύματα σφαλμάτων. Στην πρώτη περίπτωση, πληκτρολογήσαμε κολλητά, δηλαδή χωρίς κενό διάστημα, το όνομα της εντολής με το πρώτο όρισμα. Το κέλυφος που ερμηνεύει την εντολή δεν μπορεί να αντιληφθεί που τελειώνει το όνομα της εντολής και που ξεκινούν τα ορίσματα λόγω της απουσίας κενού διαστήματος, που λειτουργεί ως διαχωριστής (εναλλακτικά και πολλά κενά διαστήματα). Έτσι, προσπαθεί να βρει και να εκτελέσει την εντολή ls-l. Δεν μπορεί όμως να βρει μια τέτοια εντολή, και εμφανίζει το μήνυμα ότι η εντολή ls-l δεν μπορεί να βρεθεί.

Ακριβώς το ίδιο σφάλμα υπάρχει και στη δεύτερη εντολή. Το κέλυφος αντιλαμβάνεται ότι προσπαθούμε να εκτελέσουμε την εντολή με όνομα "ls-l" και να της δώσουμε ένα όρισμα, το "-a". Προφανώς, θα μας εμφανιστεί το ίδιο ακριβώς μήνυμα σφάλματος.

Στην τρίτη περίπτωση το λάθος είναι ότι δεν έχουμε βάλει κενό διάστημα μεταξύ των ορισμάτων. Έτσι το κέλυφος αναγνωρίζει σωστά ως όνομα εντολής το "ls" . Όμως δίνει στην εντολή ένα όρισμα το οποίο είναι το "-l-a". Το μήνυμα σφάλματος το εμφανίζει η ίδια η εντολή. Η εντολή έχει λάβει την πληροφορία ότι της δόθηκε ένα μόνο όρισμα το οποίο αντιστοιχεί στη συμβολοσειρά "-l-a". Η εντολή προσπαθώντας να ερμηνεύσει το όρισμα που δέχθηκε, ελέγχει την αρχή της συμβολοσειράς και αναγνωρίζει ότι ξεκινά με μια παύλα. Άρα ο καθένας από τους χαρακτήρες που ακολουθούν θα πρέπει να αντιστοιχεί σε μια οδηγία. Σπάει λοιπόν την συμβολοσειρά που ακολουθεί στους χαρακτήρες "l", "-", "a" και προσπαθεί να ερμηνεύσει τον καθέναν χαρακτήρα από αυτούς ως οδηγία. Για τα "l" και "a" βρίσκει σε ποια οδηγία αντιστοιχούν. Όχι όμως για το "-", το οποίο από μόνο του δεν αντιστοιχεί σε καμία. Έτσι το μήνυμα σφάλματος της εντολής είναι ότι δεν επιτρέπεται η επιλογή "-".

Εδώ, αξίζει να αναφέρουμε και την εξής ιδιάζουσα περίπτωση. Έστω ότι υπάρχει ένα αρχείο, του οποίου το όνομα ξεκινάει με το χαρακτήρα "-". Ας θεωρήσουμε ότι το αρχείο ονομάζεται "-file1.txt". Θέλουμε να χρησιμοποιήσουμε την εντολή cat, για να δούμε τα περιεχόμενά του. Εφόσον στην cat δίνουμε ως όρισμα το όνομα του αρχείου προς εμφάνιση, η παρακάτω εντολή θα περιμέναμε να εκτελεστεί σωστά:

asidirop@dellpc:~/tmp/unix$ cat -file1.txt
cat: invalid option -- 'f'
Try `cat --help' for more information.

Όμως βλέπουμε ότι η εντολή cat εμφανίζει το μήνυμα σφάλματος: «δεν επιτρέπεται η ρύθμιση 'f'». Αυτό προκύπτει από το γεγονός, ότι το όρισμα ξεκινά με τον χαρακτήρα "-". Έτσι, η εντολή cat δεν μπορεί να καταλάβει ότι πρόκειται για όνομα αρχείου, αλλά θεωρεί ότι πρόκειται για όρισμα τύπου σημαίας. Επειδή το όρισμα ξεκινάει με μια παύλα, χωρίζει την υπόλοιπη συμβολοσειρά σε χαρακτήρες "f", "i", "l", "e", "1", ".", "t", "x", "t". Τον καθέναν από τους χαρακτήρες αυτούς προσπαθεί να τον ερμηνεύσει ως οδηγία-ρύθμιση. Επειδή όμως δεν υπάρχει ρύθμιση που να αντιστοιχεί στο χαρακτήρα "f", εμφανίζεται το ανάλογο σφάλμα.

Αντίστοιχη περίπτωση θα είχαμε αν το όνομα του αρχείου που θέλουμε να εμφανίσουμε άρχιζε με δυο παύλες, για παράδειγμα "--file2.txt".

asidirop@dellpc:~/tmp/unix$  cat --file2.txt
cat: unrecognized option '--file2.txt'
Try `cat --help' for more information.

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

Πώς θα μπορούσαμε να χειριστούμε σωστά τις παραπάνω περιπτώσεις; Η απάντηση είναι: διατυπώνοντας το όνομα του αρχείου με τέτοιον τρόπο ώστε να μην αρχίζει με "-". Έτσι, μπορούμε να χρησιμοποιήσουμε τη Διαδρομή (Path) προς το αρχείο όπως παρακάτω. Για τις διαδρομές όμως θα μιλήσουμε στο επόμενο κεφάλαιο.

asidirop@dellpc:~/tmp/unix$  cat ./-file1.txt
Αυτά είναι τα περιεχόμενα του αρχείου -file1.txt
asidirop@dellpc:~/tmp/unix$  cat ./--file2.txt
Αυτά είναι τα περιεχόμενα του αρχείου --file2.txt
asidirop@dellpc:~/tmp/unix$

Διαχωρισμός εντολών

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

Εκτέλεση δυο εντολών σε μια γραμμή εντολής.
Σχήμα 1: Εκτέλεση δυο εντολών σε μια γραμμή εντολής.

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

Ακύρωση εντολής

Ακύρωση εντολής

Κατά τη διάρκεια πληκτρολόγησης μιας μακροσκελούς εντολής, και εφόσον επιθυμούμε την ακύρωση της πληκτρολόγησης μπορούμε να πατήσουμε τον συνδυασμό πλήκτρων Control-C. Το πλήκτρο Control, στο UNIX συνήθως συμβολίζεται με τον χαρακτήρα "^". Έτσι, το Control-C συμβολίζεται ως "^C". Η επιλογή του πλήκτρου "C" για την ακύρωση προκύπτει από τη λέξη "Cancel". Μετά από το πάτημα αυτού του συνδυασμού, το κέλυφος εμφανίζει στην επόμενη γραμμή την προτροπή (prompt) και είναι έτοιμο να δεχθεί την επόμενη εντολή (). Αυτός ο συνδυασμός πλήκτρων χρησιμοποιείται αντί να διαγράψουμε όλη τη γραμμή που έχουμε πληκτρολογήσει χρησιμοποιώντας το πλήκτρο "Backspace".

ακύρωση εντολής.
Σχήμα 1: Ακύρωση εντολής.

Ασκήσεις για εξάσκηση

Στόχος

Εξοικείωση με τα συστήματα Unix/Linux του τμήματος. Εξοικείωση με την γραμμή εντολών.

Άσκηση 1

  1. Χρησιμοποιείστε ένα σύστημα με Linux. Εάν είστε χρήστης των εργαστηρίων του τμήματος Μηχανικών Πληροφορικής του ΑΤΕΙ Θεσ/νίκης, επιλέξτε κατά την εκκίνηση του υπολογιστή (boot) την επιλογή "Debian Linux".
  2. Εμφανίζεται η αρχική οθόνη εισόδου όπου ζητείται το όνομα χρήστη και ο κωδικός εισόδου (username/password). Ενημερωθείτε από τον καθηγητή σας ποια πρέπει να χρησιμοποιήσετε. Login ονομάζεται η διαδικασία εισόδου στο σύστημα (ταυτοποίηση χρήστη) και logout ονομάζεται η διαδικασία εξόδου (αποσύνδεσης)
  3. Εντοπίστε την εφαρμογή "Terminal" ή "Konsole" και κάντε κλικ. Εκτελείται μια εφαρμογή η οποία προσομοιώνει ένα τερματικό. Μέσα στο τερματικό εκτελείται ένα κέλυφος (shell). Το κέλυφος είναι υπεύθυνο να αναγνωρίσει τις εντολές μας και να τις προωθήσει στον πυρήνα για εκτέλεση.
  4. Δοκιμάστε να εκτελέσετε τις παρακάτω εντολές [, , , ]:
    whoami
    date
    cal 
    cal 2016
    echo "Hello world"
    whoami; date
    
  5. Ο τρόπος που ερμηνεύονται οι εντολές εξαρτάται από το κέλυφος που χρησιμοποιούμε και όχι από το πρόγραμμα προσομοίωσης τερματικού. Πλέον ευρέως διαδεδομένο κέλυφος, που χρησιμοποιείται συχνά, είναι το "bash". Στο παρόν θα χρησιμοποιήσουμε το bash και τον πρόγονό του το sh.
  6. Πατήστε Ctrl-Alt-F1. Εμφανίζεται μπροστά σας ένα άλλο τερματικό (κονσόλα). Tην ίδια εικόνα θα βλέπατε σε κάποιο σύστημα στο οποίο δεν υπάρχει εγκατεστημένο παραθυρικό περιβάλλον. Σας ζητείται πάλι όνομα χρήστη και κωδικός.

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

  7. Εκτελέστε ακριβώς τις ίδιες εντολές με τις παραπάνω. Τα αποτελέσματα είναι ακριβώς τα ίδια, μόνο που δεν βρισκόμαστε σε παραθυρικό περιβάλλον.
  8. Πατήστε Ctrl-Alt-F2. Μια νέα κονσόλα εμφανίζεται, όπου πάλι πρέπει να δώσετε όνομα χρήστη και κωδικό. Πληκτρολογήστε τα σωστά. Δώστε μια εντολή από τις προηγούμενες και στη συνέχεια την εντολή "logout".
  9. Πατήστε Ctrl-Alt-F1. Επιστρέψατε στην προηγούμενη κονσόλα. Πληκτρολογήστε την εντολή "exit".
  10. Δοκιμάστε τους συνδυασμούς Ctrl-Alt-F1, Ctrl-Alt-F2, ... Ctrl-Alt-F6. Υπάρχουν προ-ρυθμισμένες 6 κονσόλες. Πατήστε Ctrl-Alt-F7 για να επιστρέψετε στο παραθυρικό περιβάλλον.
  11. Εντοπίστε την εφαρμογή "Terminal" ή "Konsole" και εκτελέστε τη δυο φορές. Άνοιξαν ακόμη δυο τερματικά. Μπορείτε να εργάζεστε με πολλά τερματικά συγχρόνως. Καθένα τερματικό είναι ανεξάρτητο από τα υπόλοιπα.

Άσκηση 2

Απομακρυσμένη πρόσβαση.

Όλοι οι φοιτητές του τμήματος Μηχανικών Πληροφορικής του ΑΤΕΙ Θεσσαλονίκης έχετε e-mail λογαριασμό στον mail-server του τμήματος. Η διεύθυνση του email σας είναι της μορφής:

antonis@it.teithe.gr

όπου το "antonis" είναι το όνομα χρήστη (username). Επίσης, όλοι έχετε αντίστοιχο λογαριασμό (account) στον κεντρικό Linux-server του τμήματος, o οποίος έχει τη διεύθυνση (hostname) aetos.it.teithe.gr Το όνομα χρήστη που αντιστοιχεί στον λογαριασμό σας στον aetos είναι ίδιο με το όνομα χρήστη του mail-server (πχ. antonis), όπως και ο κωδικός πρόσβασης.

Μπορείτε να "ανοίξετε" ένα κέλυφος στον aetos.it.teithe.gr ή σε οποιονδήποτε απομακρυσμένο υπολογιστή στον οποίο διαθέτετε λογαριασμό και να εκτελείτε εντολές απομακρυσμένα (δηλαδή οι εντολές σας να εκτελούνται στο απομακρυσμένο μηχάνημα). Αυτό που χρειάζεστε είναι ένα πρόγραμμα το οποίο να έχει την ικανότητα να επικοινωνεί με ένα απομακρυσμένο υπολογιστή και να εκτελέσει εκεί ένα κέλυφος. Από την άλλη μεριά, ο απομακρυσμένος υπολογιστής πρέπει να μπορεί να επικοινωνήσει με αυτό το πρόγραμμα και να δεχτεί τη σύνδεση. Αυτή η επικοινωνία των δυο υπολογιστών γίνεται βάσει κάποιον πρωτοκόλλων επικοινωνίας. Τα περισσότερο γνωστά είναι τα: telnet, rsh (remote shell), rlogin (remote login), ssh (secure shell) []. Πλέον χρησιμοποιείται μόνο το ssh, διότι τα υπόλοιπα δεν παρέχουν αρκετή ασφάλεια κατά την επικοινωνία και την ανταλλαγή δεδομένων. Ο aetos δεν θα δεχτεί καμία σύνδεση με τα υπόλοιπα πρωτόκολλα επικοινωνίας παρά μόνο με το ssh για λόγους ασφαλείας. Το ίδιο θα συμβεί και με οποιοδήποτε άλλο υπολογιστή ο οποίος διαχειρίζεται σωστά.

  1. Σε ένα από τα τερματικά που έχετε ανοίξει, πληκτρολογήστε την εντολή (όπου "antonis" βάλτε το δικό σας όνομα χρήστη):
    ssh antonis@aetos.it.teithe.gr
    
    Εάν είναι η πρώτη ασφαλής σύνδεση στον συγκεκριμένο υπολογιστή, θα σας ζητηθεί να επιβεβαιώσετε την ταυτότητα του υπολογιστή πληκτρολογώντας "yes". θα σας ζητηθεί κωδικός πρόσβασης. Πληκτρολογήστε τον κωδικό σας και πατήστε "Enter". Εφόσον έχετε πληκτρολογήσει σωστά τον κωδικό σας, το σύστημα σας καλωσορίζει όπως στο .
  2. Η προτροπή που εμφανίζει το κέλυφος, συνήθως είναι της μορφής: username@hostname:pwd$ δοκιμάστε να εκτελέσετε τις ίδιες εντολές που εκτελέσατε και τοπικά νωρίτερα. Είναι τα αποτελέσματα των εντολών ακριβώς ίδια με πριν;
  3. Δώστε την εντολή []: finger antonis
    (όπου antonis το δικό σας όνομα χρήστη)
  4. Εκτελέστε την εντολή []: who
    Τι βλέπετε ως αποτέλεσμα; Είναι το δικό σας όνομα χρήστη ανάμεσα στα αποτελέσματα της εντολής; Ποια είναι τα υπόλοιπα ονόματα χρηστών που εμφανίζονται;
  5. Επιλέξτε ένα από τα ονόματα χρηστών που σας εμφάνισε η who (πχ. το asidirop). Ποιος χρήστης είναι αυτός; Δώστε την εντολή: finger asidirop (όπου asidirop το όνομα χρήστη που επιλέξατε) για να δείτε πληροφορίες για τον χρήστη.
Απομακρυσμένη σύνδεση.
Σχήμα 1: Απομακρυσμένη σύνδεση.

Άσκηση 3

Σύνταξη εντολών.

Το κέλυφος (shell) αναμένει να πληκτρολογήσουμε εντολές. Υπάρχουν διάφορα κελύφη και το καθένα μπορεί να έχει τους δικούς του κανόνες σύνταξης. Το κέλυφος που χρησιμοποιούμε είναι το bash (βελτιωμένη έκδοση του sh). Η γενική σύνταξη μιας εντολής είναι:

Όνομα_εντολής  ορίσματα_τύπου_flag ορίσματα_αρχείων

Τα ορίσματα από το όνομα εντολής χωρίζονται με τουλάχιστον ένα κενό διάστημα (space). Τα ορίσματα μεταξύ τους χωρίζονται επίσης με τουλάχιστον ένα κενό διάστημα. Πχ:

ls  -l -a /tmp

εκτελούμε την εντολή με όνομα "ls", και της δίνουμε τρία ορίσματα:

Συνήθως οι εντολές διαχωρίζουν τα ορίσματα που εκφράζουν όνομα αρχείου από τα ορίσματα που εκφράζουν σημαία (flag ή option) από την παύλα (-) που βάζουμε μπροστά στα ορίσματα τύπου σημαίας. Τα ορίσματα που μπορούμε να δώσουμε σε κάθε εντολή εξαρτώνται αποκλειστικά από την ίδια την εντολή.

  1. Εκτελέστε τις παρακάτω εντολές:
    1. ls
    2. ls -a
    3. ls -l
    4. ls -l  -a
    5. ls -la
    6. ls --all
    7. ls -a
  2. Τι διαφορά υπάρχει στο αποτέλεσμα των εντολών (6) και (7);
  3. Τι διαφορά υπάρχει στο αποτέλεσμα των εντολών (4) και (5);

Η εντολή ls εμφανίζει τα περιεχόμενα (αρχεία και υποκαταλόγους) του καταλόγου (φακέλου) τον οποίο έχουμε ως τρέχοντα φάκελο εργασίας (στο επόμενο κεφάλαιο θα δούμε περισσότερες λεπτομέρειες γι’ αυτό).

Με τα ορίσματα σε μια εντολή δίνουμε οδηγίες στην εντολή πώς να συμπεριφερθεί. Για την ls το -a σημαίνει όλα τα αρχεία (και τα κρυφά). Το -l σημαίνει να εμφανίσει επιπλέον πληροφορίες για τα αρχεία (long listing).

Για να δούμε τα δυνατά ορίσματα που μπορεί να δεχτεί μια εντολή, πρέπει να διαβάσουμε το εγχειρίδιο χρήσης ή αλλιώς "manual page".

Οι περισσότερες εντολές, όταν οι σημαίες εκφράζονται με ένα γράμμα (πχ: -a ή -l) επιτρέπουν την σύμπτυξη τους: -a -l ⇔ -al. Αυτό είναι θέμα δυνατοτήτων της κάθε εντολής και όχι του κελύφους ή του UNIX.

  1. Εκτελέστε την εντολή: "man ls".
Βρείτε τι σημαίνει το "--all".

Η εντολή man εμφανίζει το εγχειρίδιο χρήσης (manual page) της εντολής της οποίας το όνομα δώσαμε ως όρισμα. Μέσα στο "man" μπορούμε να μετακινηθούμε πάνω-κάτω με τους κέρσορες ή το πλήκτρο κενού διαστήματος (space), ή το "Enter". Για έξοδο από το περιβάλλον του εγχειριδίου πατάμε το πλήκτρο "q".

  1. Εκτελέστε την εντολή:
    ls-l
    
    Τι παρατηρείτε; Γιατί;

Αναφορές