2.1 Μάθημα 2
Πιστοποιητικό: |
Linux Essentials |
---|---|
Έκδοση: |
1.6 |
Θέμα: |
2 Βρίσκοντας το Δρόμο σας σε ένα Σύστημα Linux |
Σκοπός: |
2.1 Βασικά Στοιχεία Γραμμής Εντολών |
Μάθημα: |
2 απο 2 |
Εισαγωγή
Όλα τα shells διαχειρίζονται ένα σύνολο πληροφοριών κατάστασης κατά την διάρκεια των sessions του shell. Αυτή η πληροφορία του χρόνου λειτουργίας [runtime] ενδέχεται να αλλάξει κατά τη διάρκεια του session και επηρεάζει τον τρόπο συμπεριφοράς του shell. Αυτά τα δεδομένα χρησιμοποιούνται επίσης από προγράμματα για να καθορίσουν τις πτυχές της παραμετροποίησης του συστήματος. Τα περισσότερα από αυτά τα δεδομένα αποθηκεύονται στις λεγόμενες μεταβλητές, τις οποίες θα καλύψουμε σε αυτό το μάθημα.
Μεταβλητές
Οι μεταβλητές είναι μέρη αποθήκευσης δεδομένων, όπως κείμενο ή αριθμοί. Μόλις οριστεί, η τιμή μιας μεταβλητής θα είναι προσβάσιμη αργότερα. Οι μεταβλητές έχουν ένα όνομα που επιτρέπει την πρόσβαση σε μια συγκεκριμένη μεταβλητή, ακόμη και όταν αλλάζει το περιεχόμενο της μεταβλητής. Είναι ένα πολύ κοινό εργαλείο στις περισσότερες γλώσσες προγραμματισμού.
Στα περισσότερα Linux shells, υπάρχουν δύο τύποι μεταβλητών:
- Τοπικές μεταβλητές
-
Αυτές οι μεταβλητές είναι διαθέσιμες μόνο για το τρέχον shell process. Εάν δημιουργήσετε μια τοπική μεταβλητή και στη συνέχεια ξεκινήσετε ένα άλλο πρόγραμμα από αυτό το shell, η μεταβλητή δεν είναι πλέον προσβάσιμη σε αυτό το πρόγραμμα. Επειδή δεν κληρονομούνται από subprocesses, αυτές οι μεταβλητές ονομάζονται τοπικές μεταβλητές.
- Μεταβλητές περιβάλλοντος
-
Αυτές οι μεταβλητές είναι διαθέσιμες τόσο σε ένα συγκεκριμένο shell session όσο και σε subprocesses που αναδημιουργήθηκαν από αυτό το shell session. Αυτές οι μεταβλητές μπορούν να χρησιμοποιηθούν για τη μεταφορά δεδομένων παραμετροποίησης σε εντολές που εκτελούνται. Επειδή αυτά τα προγράμματα έχουν πρόσβαση σε αυτές τις μεταβλητές, ονομάζονται περιβαλλοντικές μεταβλητές. Η πλειοψηφία των μεταβλητών περιβάλλοντος είναι με κεφαλαία γράμματα (π.χ.
PATH
,DATE
,USER
). Ένα σύνολο προεπιλεγμένων μεταβλητών περιβάλλοντος παρέχει, για παράδειγμα, πληροφορίες σχετικά με τον κατάλογο αφετηρίας του χρήστη ή τον τύπο τερματικού. Μερικές φορές το πλήρες σύνολο όλων των μεταβλητών περιβάλλοντος αναφέρεται ως περιβάλλον.
Note
|
Οι μεταβλητές δεν είναι διαρκείς. Όταν κλείσει το shell στο οποίο ορίστηκαν, όλες οι μεταβλητές και το περιεχόμενό τους χάνονται. Τα περισσότερα shells παρέχουν αρχεία διαμόρφωσης που περιέχουν μεταβλητές που ορίζονται κάθε φορά που ξεκινά ένα νέο shell. Οι μεταβλητές που πρέπει να οριστούν μόνιμα πρέπει να προστεθούν σε ένα από αυτά τα αρχεία διαμόρφωσης. |
Χειρισμός Mεταβλητών
Ως διαχειριστής συστήματος, θα χρειαστεί να δημιουργήσετε, να τροποποιήσετε ή να αφαιρέσετε τόσο τοπικές όσο και μεταβλητές περιβάλλοντος.
Εργασία με Τοπικές Mεταβλητές
Μπορείτε να ορίσετε μια τοπική μεταβλητή χρησιμοποιώντας τον τελεστή =
(ίσον). Μια απλή ανάθεση θα δημιουργήσει μια τοπική μεταβλητή:
$ greeting=hello
Note
|
Μην τοποθετείτε κανένα κενό χαρακτήρα διαστήματος πριν ή μετά τον τελεστή |
Μπορείτε να εμφανίσετε οποιαδήποτε μεταβλητή χρησιμοποιώντας την εντολή echo
. Η εντολή εμφανίζει συνήθως το κείμενο που της δίνεται ως όρισμα:
$ echo greeting greeting
Για να αποκτήσετε πρόσβαση στην τιμή της μεταβλητής, θα πρέπει να χρησιμοποιήσετε το $
(σύμβολο δολαρίου) μπροστά από το όνομα της μεταβλητής.
$ echo $greeting hello
Όπως φαίνεται, η μεταβλητή έχει δημιουργηθεί. Τώρα ανοίξτε ένα άλλο shell και προσπαθήστε να εμφανίσετε τα περιεχόμενα της μεταβλητής που δημιουργήθηκε.
$ echo $greeting
Δεν εμφανίζεται τίποτα. Αυτό δείχνει ότι οι μεταβλητές υπάρχουν πάντα μόνο σε ένα συγκεκριμένο shell.
Για να επαληθεύσετε ότι η μεταβλητή είναι στην πραγματικότητα μια τοπική μεταβλητή, προσπαθήστε να αναδημιουργήσετε ένα νέο process και ελέγξτε εάν αυτή η διαδικασία μπορεί να έχει πρόσβαση στη μεταβλητή. Μπορούμε να το κάνουμε ξεκινώντας ένα άλλο shell και αφήνοντας αυτό το shell να εκτελέσει την εντολή echo
. Καθώς το νέο shell εκτελείται σε ένα νέο process, δεν θα κληρονομήσει τοπικές μεταβλητές από το parent process του:
$ echo $greeting world hello world $ bash -c 'echo $greeting world' world
Note
|
Βεβαιωθείτε ότι χρησιμοποιείτε μονά εισαγωγικά στο παραπάνω παράδειγμα. |
Για να καταργήσετε μια μεταβλητή, θα χρειαστεί να χρησιμοποιήσετε την εντολή unset
:
$ echo $greeting hey $ unset greeting $ echo $greeting
Note
|
Η εντολή |
Εργασία με Καθολικές [Global] Μεταβλητές
Για να κάνετε μια μεταβλητή διαθέσιμη σε subprocesses, μετατρέψτε την από τοπική σε μεταβλητή περιβάλλοντος. Αυτό γίνεται με την εντολή export
. Όταν καλείται με το όνομα της μεταβλητής, αυτή η μεταβλητή προστίθεται στο περιβάλλον του shell:
$ greeting=hello $ export greeting
Note
|
Και πάλι, βεβαιωθείτε ότι δεν χρησιμοποιείτε το |
Ένας ευκολότερος τρόπος δημιουργίας της μεταβλητής περιβάλλοντος είναι ο συνδυασμός και των δύο παραπάνω μεθόδων, αναθέτοντας την τιμή της μεταβλητής στο τμήμα ορίσματος της εντολής.
$ export greeting=hey
Ας ελέγξουμε ξανά εάν η μεταβλητή είναι προσβάσιμη σε subprocesses:
$ export greeting=hey $ echo $greeting world hey world $ bash -c 'echo $greeting world' hey world
Ένας άλλος τρόπος χρήσης μεταβλητών περιβάλλοντος είναι η χρήση τους μπροστά από εντολές. Μπορούμε να το δοκιμάσουμε με τη μεταβλητή περιβάλλοντος TZ
που διατηρεί τη ζώνη ώρας. Αυτή η μεταβλητή χρησιμοποιείται από την εντολή date
για να καθορίσει ποια ζώνη ώρας θα παρουσιάσει:
$ TZ=EST date Thu 31 Jan 10:07:35 EST 2019 $ TZ=GMT date Thu 31 Jan 15:07:35 GMT 2019
Μπορείτε να εμφανίσετε όλες τις μεταβλητές περιβάλλοντος χρησιμοποιώντας την εντολή env
.
Η Μεταβλητή PATH
Η μεταβλητή PATH
είναι μία από τις σημαντικότερες μεταβλητές περιβάλλοντος σε ένα σύστημα Linux. Αποθηκεύει μια λίστα καταλόγων, χωρισμένων με άνω και κάτω τελεία, που περιέχουν εκτελέσιμα προγράμματα που είναι κατάλληλα ως εντολές από το Linux shell.
$ echo $PATH /home/user/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
Για να προσθέσετε έναν νέο κατάλογο στη μεταβλητή, θα χρειαστεί να χρησιμοποιήσετε το σύμβολο άνω και κάτω τελεία (:
).
$ PATH=$PATH:new_directory
Εδώ ένα παράδειγμα:
$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin $ PATH=$PATH:/home/user/bin $ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/user/bin
Όπως βλέπετε, το $PATH
χρησιμοποιείται στη νέα τιμή που έχει ανατεθεί στο`PATH`. Αυτή η μεταβλητή αναλύεται κατά την εκτέλεση της εντολής και διασφαλίζει ότι διατηρείται το αρχικό περιεχόμενο της μεταβλητής. Φυσικά, μπορείτε να χρησιμοποιήσετε και άλλες μεταβλητές στην ανάθεση:
$ mybin=/opt/bin $ PATH=$PATH:$mybin $ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/user/bin:/opt/bin
- Η μεταβλητή
PATH
πρέπει να αντιμετωπίζεται με προσοχή, καθώς είναι ζωτικής σημασίας για την εργασία στη γραμμή εντολών. Ας εξετάσουμε την ακόλουθη μεταβλητήPATH
$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Για να μάθετε πώς το shell καλεί μια συγκεκριμένη εντολή, η εντολή which
μπορεί να εκτελεστεί με όρισμα το όνομα της εντολής. Μπορούμε, για παράδειγμα, να προσπαθήσουμε να μάθουμε πού αποθηκεύεται το nano
:
$ which nano /usr/bin/nano
Όπως φαίνεται, το εκτελέσιμο nano
βρίσκεται μέσα στον κατάλογο /usr/bin
. Ας αφαιρέσουμε τον κατάλογο από τη μεταβλητή και να ελέγξουμε αν η εντολή εξακολουθεί να λειτουργεί:
$ PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/sbin:/bin:/usr/games $ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/sbin:/bin:/usr/games
Ας αναζητήσουμε ξανά την εντολή nano
:
$ which nano which: no nano in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/sbin:/bin:/usr/games)
Όπως φαίνεται, η εντολή δεν βρίσκεται, επομένως δεν εκτελείται. Το μήνυμα σφάλματος εξηγεί επίσης τον λόγο για τον οποίο η εντολή δεν βρέθηκε και σε ποιες τοποθεσίες αναζητήθηκε.
Ας προσθέσουμε ξανά τους καταλόγους και να προσπαθήσουμε να εκτελέσουμε ξανά την εντολή.
$ PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin $ which nano /usr/bin/nano
Τώρα η εντολή μας λειτουργεί ξανά.
Tip
|
Η σειρά των στοιχείων στο |
Καθοδηγούμενες Ασκήσεις
-
Δημιουργήστε μια τοπική μεταβλητή
number
. -
Δημιουργήστε μια μεταβλητή περιβάλλοντος
ORDER
, χρησιμοποιώντας μία από τις δύο παραπάνω μεθόδους. -
Εμφανίστε τόσο τα ονόματα των μεταβλητών όσο και το περιεχόμενό τους.
-
Ποια είναι τα πεδία εμβέλειας των μεταβλητών που δημιουργήθηκαν προηγουμένως;
Ασκήσεις Εξερεύνησης
-
Δημιουργήστε μια τοπική μεταβλητή
nr_files
και αναθέστε τον αριθμό των γραμμών που βρίσκονται στο αρχείο/etc/passwd
. Συμβουλή: Κοιτάξτε την εντολήwc
και την υποκατάσταση εντολών και μην ξεχνάτε τα εισαγωγικά. -
Δημιουργήστε μια μεταβλητή περιβάλλοντος
ME
. Αναθέστε την τιμή της μεταβλητήςUSER
σε αυτήν. -
Προσθέστε την τιμή της μεταβλητής
HOME
στοME
, έχοντας ως οριοθέτη το:
. Εμφανίστε τα περιεχόμενα της μεταβλητήςME
. -
Χρησιμοποιώντας το παραπάνω παράδειγμα ημερομηνίας, δημιουργήστε μια μεταβλητή που ονομάζεται
today
και αναθέστε την ημερομηνία για μία από τις ζώνες ώρας. -
Δημιουργήστε μια άλλη μεταβλητή που ονομάζεται
today1
και αντιστοιχίστε την ημερομηνία του συστήματος σε αυτήν.
Σύνοψη
Σε αυτό το εργαστήριο μάθατε:
-
Τύποι μεταβλητών
-
Πώς να δημιουργήσετε μεταβλητές
-
Πώς να χειριστείτε μεταβλητές
Εντολές που χρησιμοποιήθηκαν στις ασκήσεις:
env
-
Εμφάνιση του τρέχοντος περιβάλλοντος.
echo
-
Έξοδος κειμένου.
export
-
Κάντε διαθέσιμες τις τοπικές μεταβλητές σε subprocesses.
unset
-
Καταργήστε μια μεταβλητή.
Απαντήσεις στις Καθοδηγούμενες Ασκήσεις
-
Δημιουργήστε μια τοπική μεταβλητή
number
.$ number=5
-
Δημιουργήστε μια μεταβλητή περιβάλλοντος
ORDER
, χρησιμοποιώντας μία από τις δύο παραπάνω μεθόδους.$ export ORDER=desc
-
Εμφανίστε τόσο τα ονόματα των μεταβλητών όσο και το περιεχόμενό τους.
$ echo number number $ echo ORDER ORDER $ echo $number 5 $ echo $ORDER desc
-
Ποια είναι τα πεδία εμβέλειας των μεταβλητών που δημιουργήθηκαν προηγουμένως;
-
Το πεδίο εμβέλειας της τοπικής μεταβλητής
number
είναι το τρέχον shell μόνο. -
Το πεδίο εμβέλειας της μεταβλητής περιβάλλοντος
ORDER
είναι το τρέχον shell και όλα τα subshells που δημιουργήθηκαν απο αυτό.
-
Απαντήσεις στις Ασκήσεις Εξερεύνησης
-
Δημιουργήστε μια τοπική μεταβλητή
nr_files
και αναθέστε τον αριθμό των γραμμών που βρίσκονται στο αρχείο/etc/passwd
. Συμβουλή: Κοιτάξτε την εντολήwc
και την υποκατάσταση εντολών και μην ξεχνάτε τα εισαγωγικά.$ nr_files=`wc -l /etc/passwd`
-
Δημιουργήστε μια μεταβλητή περιβάλλοντος
ME
. Αναθέστε την τιμή της μεταβλητήςUSER
σε αυτήν.$ export ME=$USER
-
Προσθέστε την τιμή της μεταβλητής
HOME
στοME
, έχοντας ως οριοθέτη το:
. Εμφανίστε τα περιεχόμενα της μεταβλητήςME
.$ ME=$ME:$HOME $ echo $ME user:/home/user
-
Χρησιμοποιώντας το παραπάνω παράδειγμα ημερομηνίας, δημιουργήστε μια μεταβλητή που ονομάζεται
today
και αναθέστε την ημερομηνία για μία από τις ζώνες ώρας.Τα παρακάτω χρησιμοποιούν τις ζώνες ώρας GMT και EST ως παράδειγμα, αλλά οποιαδήποτε επιλογή ζώνης ώρας είναι έγκυρη.
$ today=$(TZ=GMT date) $ echo $today Thu 31 Jan 15:07:35 GMT 2019
or
$ today=$(TZ=EST date) $ echo $today Thu 31 Jan 10:07:35 EST 2019
-
Δημιουργήστε μια άλλη μεταβλητή που ονομάζεται
today1
και αντιστοιχίστε την ημερομηνία του συστήματος σε αυτήν.Υποθέτοντας ότι είστε στο GMT:
$ today1=$(date) $ echo $today1 Thu 31 Jan 10:07:35 EST 2019