Η πλειοψηφία της τεχνολογικής κοινότητας απολαμβάνει την αλληλεπίδραση με συστήματα μέσω της διεπαφής γραμμής εντολών (CMD) ή του shell. Γενικά, αυτό διευκολύνει την εργασία τους. Για παράδειγμα, μπορείτε να δημιουργήσετε μια εντολή shell που μπορεί να εκτελέσει αυτόματα διάφορες εργασίες, σε αντίθεση με το να πρέπει να κάνετε κλικ σε πολλά κουμπιά ενός GUI.
Όταν εκκινείτε ένα πρόγραμμα shell ή CMD, συγκεντρώνει διάφορες πληροφορίες. Οι πληροφορίες αυτές καθορίζουν τον τρόπο με τον οποίο το πρόγραμμα αποκτά πρόσβαση στους υποκείμενους πόρους του συστήματος καθώς και τη συνολική συμπεριφορά του. Μπορείτε να τις αποθηκεύσετε σε ένα μέρος που ονομάζεται περιβάλλον (environment). Το περιβάλλον αποτελείται από συμβολοσειρές που αναπαριστούν ζεύγη κλειδιού-τιμής. Σε αυτόν τον οδηγό, θα χρησιμοποιήσουμε Ubuntu 20.04 VPS ως παράδειγμα για να σας καθοδηγήσουμε κατά τη ρύθμιση μεταβλητών περιβάλλοντος ή shell. Ο οδηγός θα πρέπει να εφαρμόζεται και σε άλλες διανομές Linux.
Ποια είναι η διαφορά μεταξύ των μεταβλητών περιβάλλοντος (Environmental Variables) και των μεταβλητών Shell (Shell Variables);
Όταν ξεκινάτε μια συνεδρία, συλλέγονται πληροφορίες από τις ρυθμίσεις και τα αρχεία παραμέτρων του συστήματος’. Στη συνέχεια, είναι διαθέσιμες στη διεργασία shell και στις θυγατρικές διεργασίες της. Αυτές οι πληροφορίες είναι ένα σύνολο ζευγών κλειδιού-τιμής σε αυτήν τη μορφή:
|
1 2 3 |
KEY=value KEY="Some value" KEY=data1:data2 |
Τα ονόματα των μεταβλητών, δηλαδή τα κλειδιά, έχουν διάκριση πεζών-κεφαλαίων (case sensitive). Ωστόσο, είναι συμβατικά αποδεκτό να γράφονται με ΚΕΦΑΛΑΙΑ γράμματα. Αυτό σας βοηθά να τα διακρίνετε σε άλλα πλαίσια. Με τον χαρακτήρα άνω-κάτω τελείας ‘:’ μπορείτε να αντιστοιχίσετε πολλαπλές τιμές στην ίδια μεταβλητή. Είναι επίσης σημαντικό να διασφαλίσετε ότι δεν θα αφήσετε κενό γύρω από το =. Τα κλειδιά είναι οι μεταβλητές και ταξινομούνται σε δύο κατηγορίες: μεταβλητές περιβάλλοντος (environmental variables) και μεταβλητές shell (shell variables). Οι μεταβλητές περιβάλλοντος περιέχουν όλες τις μεταβλητές που ορίζονται σε επίπεδο συστήματος και είναι διαθέσιμες σε κάθε θυγατρικό shell ή διεργασία. Βοηθούν στη μεταβίβαση πληροφοριών στις διεργασίες που ξεκινάτε μέσω των εντολών shell. Οι μεταβλητές Shell περιλαμβάνουν μόνο μεταβλητές που ορίζονται στη συγκεκριμένη συνεδρία shell. Επιπλέον, περιλαμβάνουν μόνο μεταβλητές που είναι διαθέσιμες αποκλειστικά εντός του δικού τους στιγμιότυπου shell.
Λίστα μεταβλητών περιβάλλοντος και Shell
Από προεπιλογή, το τερματικό παρέχει δύο εντολές για την εμφάνιση των μεταβλητών περιβάλλοντος και shell: env ή printenv. Εμφανίζουν τις ίδιες πληροφορίες στην προεπιλεγμένη τους κατάσταση. Ακολουθεί ένα δείγμα εξόδου από αυτές τις εντολές:
Χρήση του env:

Χρήση του printenv:

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

Για να δείτε πολλαπλές τιμές, μπορείτε να περάσετε περισσότερα από ένα ορίσματα στην εντολή printenv. Οι τιμές θα εμφανιστούν με τη σειρά που εισαγάγατε τα ορίσματα:

Μπορείτε επίσης να χρησιμοποιήσετε την εντολή echo με το όνομα της μεταβλητής για να εμφανίσετε την τιμή μιας μεταβλητής:

Η εντολή env σάς επιτρέπει να τροποποιήσετε το περιβάλλον στο οποίο εκτελούνται τα προγράμματα, περνώντας ορισμούς μεταβλητών με μια σύνταξη όπως:
|
1 |
env VAR1="var 1 value" command_to_run command_options |
Αυτό σας επιτρέπει να παρακάμψετε τιμές ή να ορίσετε νέες τιμές που μπορούν να χρησιμοποιηθούν από τη θυγατρική διεργασία. Οι εντολές printenv και env εμφανίζουν τις μεταβλητές περιβάλλοντος όπως είδαμε παραπάνω. Αυτές ήταν ήδη ορισμένες για τις διεργασίες του συστήματος. Αν θέλετε να δείτε μια λίστα με τις μεταβλητές shell, μπορείτε να χρησιμοποιήσετε την εντολή set. Πληκτρολογώντας set χωρίς μεταβλητές θα επιστραφεί μια λίστα με όλες τις μεταβλητές περιβάλλοντος, τις μεταβλητές shell, τις τοπικές μεταβλητές και τις συναρτήσεις shell:

Οι μεταβλητές μπορεί να είναι πάρα πολλές. Εάν χρειάζεται, μπορείτε να τις σελιδοποιήσετε χρησιμοποιώντας την εντολή:
|
1 |
set | less |
Μπορείτε να καθαρίσετε περαιτέρω το αποτέλεσμα ορίζοντας την εντολή set να εκτελεστεί σε POSIX, αποφεύγοντας έτσι την εκτύπωση των συναρτήσεων shell. Εδώ εκτελούμε σε ένα subshell (ξεχωριστό στιγμιότυπο του επεξεργαστή εντολών) για να αποτρέψουμε την εντολή από το να αλλάξει το τρέχον περιβάλλον:
|
1 |
(set -o posix; set) |
Τα παραπάνω εμφανίζουν όλες τις εντολές περιβάλλοντος και shell που είναι διαθέσιμες στο σύστημα. Μπορείτε να περιορίσετε το αποτέλεσμα χρησιμοποιώντας την ακόλουθη εντολή για να προσπαθήσετε να λάβετε μόνο τις μεταβλητές shell:
|
1 |
comm -23 <(set -o posix; set | sort) <(env | sort) |
Μια ενδεικτική έξοδος από την παραπάνω εντολή είναι:

Παρόλο που η εντολή μπορεί να περιλαμβάνει μερικές μεταβλητές περιβάλλοντος, θα σας βοηθήσει να διαφοροποιήσετε τις μεταβλητές κελύφους από τις μεταβλητές περιβάλλοντος. Αυτό συμβαίνει επειδή η εντολή set εισάγει σε εισαγωγικά τις τιμές των μεταβλητών, ενώ οι εντολές printenv και env δεν το κάνουν. Οι μεταβλητές κελύφους είναι χρήσιμες για τον ορισμό μόνιμων τιμών για περιόδους λειτουργίας, χωρίς να εγγράφονται μόνιμα οι αλλαγές σε αρχεία.
Κοινές Μεταβλητές Περιβάλλοντος
USER – Ο τρέχων συνδεδεμένος χρήστης.
SHELL – Το κέλυφος που θα ερμηνεύει τις εντολές που εισάγετε. Η προεπιλογή είναι το bash, αλλά μπορείτε να το αλλάξετε.
HOME – Ο αρχικός κατάλογος του τρέχοντος χρήστη.
TERM – Καθορίζει τον τύπο του τερματικού προς εξομοίωση. Δείχνει το τρέχον εξομοιούμενο τερματικό.
PWD – Ο τρέχων κατάλογος εργασίας.
OLDPWD – Ο προηγούμενος κατάλογος εργασίας. Αυτό βοηθά το κέλυφος να μεταβεί στον προηγούμενο κατάλογο όταν εισάγετε την εντολή αλλαγής καταλόγου ως cd.
EDITOR – Ο προεπιλεγμένος επεξεργαστής αρχείων όταν πληκτρολογείτε edit στο τερματικό σας.
LS_COLORS – Ορίζει τους κωδικούς χρωμάτων που χρησιμοποιούνται για την προσθήκη έγχρωμης εξόδου όταν εισάγετε την εντολή ls. Βοηθά στη διαφοροποίηση των τύπων αρχείων και παρέχει πληροφορίες στους χρήστες.
LOGNAME – Το όνομα του τρέχοντος χρήστη.
MAIL – Ορίζει τη διαδρομή προς το γραμματοκιβώτιο του τρέχοντος χρήστη.
LANG – Ορίζει την τρέχουσα ρύθμιση τοπικού προσαρμογέα.
PATH – Καθορίζει μια λίστα καταλόγων για αναζήτηση κατά την εκτέλεση των εντολών. Κατά την εκτέλεση μιας εντολής, το σύστημα αναζητά σε αυτούς τους καταλόγους και χρησιμοποιεί το πρώτο εκτελέσιμο που θα βρεθεί.
_ – Η τελευταία εκτελεσθείσα εντολή.
Κοινές Μεταβλητές Κελύφους:
BASH_VERSION – Η έκδοση του bash, σε μορφή αναγνώσιμη από τον άνθρωπο.
BASH_VERSINFO – Η έκδοση του bash, σε μορφή αναγνώσιμη από μηχανή.
BASHOPTS – Η λίστα των επιλογών που χρησιμοποιήθηκαν κατά την εκτέλεση του bash. Χρήσιμο για να προσδιορίσετε εάν το περιβάλλον του κελύφους θα λειτουργήσει όπως αναμένετε.
COLUMNS – Ο αριθμός των στηλών σε πλάτος που χρησιμοποιούνται για τη σχεδίαση της εξόδου στην οθόνη.
DIRSTACK – Η στοίβα καταλόγων που είναι διαθέσιμη με τις εντολές pushd και popd.
HOSTNAME – Το όνομα κεντρικού υπολογιστή του υπολογιστή αυτή τη στιγμή.
HISTFILESIZE – Ο αριθμός των γραμμών ιστορικού εντολών που αποθηκεύονται σε ένα αρχείο.
HISTSIZE – Ο αριθμός των γραμμών ιστορικού εντολών που επιτρέπονται στη μνήμη.
IFS – Ο εσωτερικός διαχωριστής πεδίων για τον διαχωρισμό της εισόδου στη γραμμή εντολών. Είναι ένα κενό διάστημα από προεπιλογή.
SHELLOPTS-Χρησιμοποιείται για τον ορισμό επιλογών κελύφους.
UID-Το UID του τρέχοντος χρήστη.
PS1– Ο ορισμός της κύριας προτροπής εντολών. Αυτό χρησιμοποιείται για να ορίσει πώς φαίνεται η προτροπή σας όταν ξεκινάτε μια περίοδο λειτουργίας κελύφους.
PS2 – Δήλωση δευτερευουσών προτροπών για όταν μια εντολή εκτείνεται σε πολλές γραμμές.
Ορισμός Εντολών Περιβάλλοντος και Κελύφους
Πρώτον, όπως εξηγήθηκε προηγουμένως, θα διατηρήσουμε τα ονόματα των μεταβλητών με κεφαλαία γράμματα. Στη συνέχεια, θα προχωρήσουμε στη δημιουργία μεταβλητών κελύφους. Τέλος, θα δημιουργήσουμε μεταβλητές περιβάλλοντος.
Δημιουργία Μεταβλητών Κελύφους
Ας ξεκινήσουμε με το συνηθισμένο hello world. Εισαγάγετε τα ακόλουθα στο τερματικό σας:
|
1 |
MY_FIRST_VAR=’Hello World!’ |
Τα εισαγωγικά χρησιμοποιούνται επειδή η μεταβλητή περιέχει κενό διάστημα. Παρατηρήστε ότι χρησιμοποιήσαμε μονά εισαγωγικά επειδή το θαυμαστικό είναι ειδικός χαρακτήρας και θα πρέπει είτε να διαφύγει είτε να τοποθετηθεί σε μονά εισαγωγικά. Τώρα, έχετε δημιουργήσει την πρώτη σας μεταβλητή κελύφους. Είναι διαθέσιμη μόνο στην τρέχουσα περίοδο λειτουργίας κελύφους. Οι μεταβλητές κελύφους δεν είναι διαθέσιμες σε θυγατρικά κελύφη και διεργασίες. Μπορείτε να την εκτυπώσετε στο τερματικό χρησιμοποιώντας την εντολή set με grep:

Ή εμφανίστε την τιμή χρησιμοποιώντας την echo, αναφέροντάς την με το σύμβολο $ και το όνομα της μεταβλητής:

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

Δημιουργία Μεταβλητών Περιβάλλοντος
Η μεταβλητή κελύφους που δημιουργήθηκε προηγουμένως μπορεί να μετατραπεί σε μεταβλητή περιβάλλοντος χρησιμοποιώντας την εντολή export. Πρώτα, δημιουργείτε μια μεταβλητή κελύφους. Στη συνέχεια, για να δημιουργήσετε μια μεταβλητή περιβάλλοντος, πρέπει να χρησιμοποιήσετε την εντολή export. Μετά την εκτέλεση αυτής της εντολής, η μεταβλητή θα είναι διαθέσιμη σε θυγατρικά κελύφη και διεργασίες:
|
1 |
export MY_FIRST_VAR |
Τώρα, αν κάνετε δοκιμή χρησιμοποιώντας την εντολή printenv, θα πρέπει να δείτε τη μεταβλητή και την τιμή:

Μπορείτε επίσης να δημιουργήσετε μια μεταβλητή περιβάλλοντος σε ένα βήμα χρησιμοποιώντας τη σύνταξη:
|
1 |
export MY_SECOND_VAR='Αυτή είναι η δεύτερη μεταβλητή μου' |
Οι μεταβλητές περιβάλλοντος μεταβιβάζονται μόνο στα θυγατρικά κελύφη και όχι στο γονικό. Αυτό βοηθά στην αποτροπή των θυγατρικών διεργασιών από το να επηρεάσουν το περιβάλλον του προγράμματος που τις κάλεσε.
Υποβιβασμός και κατάργηση ορισμού μεταβλητών
Αν παρακολουθείτε τον οδηγό μέχρι αυτή τη στιγμή, τότε έχετε ακόμα τη μεταβλητή MY_FIRST_VAR ορισμένη ως μεταβλητή περιβάλλοντος. Μπορείτε να την επαναφέρετε σε εντολή κελύφους πληκτρολογώντας την εντολή echo με τη σημαία –n:
|
1 |
export -n MY_FIRST_VAR |
Αν κάνετε δοκιμή με το printenv, δεν θα υπάρξει έξοδος. Ωστόσο, η εντολή echo θα την εμφανίσει επειδή εξακολουθεί να είναι εντολή κελύφους:

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

Ορισμός μεταβλητών περιβάλλοντος κατά τη σύνδεση
Πολλά προγράμματα εξαρτώνται από μεταβλητές περιβάλλοντος για την εκτέλεσή τους. Δεδομένου ότι δεν είναι αποτελεσματικό να ορίζετε τις μεταβλητές κάθε φορά που θέλετε να εκτελέσετε ένα πρόγραμμα, το Linux παρέχει έναν τρόπο να τις ορίσετε και να τις αποθηκεύσετε σε ένα αρχείο. Με αυτόν τον τρόπο, μπορούν να ορίζονται αυτόματα κατά τη σύνδεση. Το κέλυφος διαβάζει διαφορετικά αρχεία ρυθμίσεων ανάλογα με τον τρόπο έναρξης της περιόδου λειτουργίας. Αυτά συζητούνται παρακάτω:
Τύποι περιόδων λειτουργίας κελύφους και οι διαφορές τους
- Περίοδος λειτουργίας κελύφους σύνδεσης – ξεκινά με τον έλεγχο ταυτότητας του χρήστη. Η περίοδος λειτουργίας ορίζεται όταν συνδέεστε μέσω SSH ή περιόδου λειτουργίας τερματικού.
- Περίοδος λειτουργίας κελύφους χωρίς σύνδεση – ξεκινά όταν εκκινείτε ένα νέο κέλυφος μέσα από το πιστοποιημένο κέλυφός σας. Μπορείτε να εκκινήσετε ένα νέο κέλυφος χρησιμοποιώντας την εντολή bash. Δεν απαιτούνται στοιχεία ελέγχου ταυτότητας.
- Διαδραστική περίοδος λειτουργίας κελύφους – μια περίοδος λειτουργίας κελύφους συνδεδεμένη με μια περίοδο λειτουργίας τερματικού.
- Μη διαδραστική περίοδος λειτουργίας κελύφους – μια περίοδος λειτουργίας κελύφους που δεν είναι συνδεδεμένη με περίοδο λειτουργίας τερματικού – εκτελείται στο παρασκήνιο.
Μια περίοδος λειτουργίας ταξινομείται είτε ως σύνδεσης είτε ως χωρίς σύνδεση, και είτε ως διαδραστική είτε ως μη διαδραστική. Όταν συνδέεστε και ξεκινάτε μια περίοδο λειτουργίας κελύφους μέσω SSH, τότε αυτή θα είναι μια περίοδος λειτουργίας κελύφους σύνδεσης και διαδραστική. Όταν εκτελείτε ένα σενάριο στο τερματικό, συνήθως εκτελείται σε μια περίοδο λειτουργίας χωρίς σύνδεση και μη διαδραστική. Μια περίοδος λειτουργίας κελύφους μπορεί επίσης να είναι ένας συνδυασμός των δύο. Επομένως, ποιο αρχείο ρυθμίσεων επιλέγεται;
Μια περίοδος λειτουργίας σύνδεσης διαβάζει πρώτα τα αρχεία ρυθμίσεων από τον κατάλογο /etc/profile. Δεύτερον, ελέγχει τα συγκεκριμένα αρχεία ρυθμίσεων του χρήστη από τον αρχικό κατάλογο του χρήστη. Διαβάζεται μόνο το πρώτο αρχείο που θα βρεθεί από τα ~/.bash_profile, ~/.bash_login και ~/.profile και όλα τα άλλα αρχεία αγνοούνται. Μια περίοδος λειτουργίας χωρίς σύνδεση θα διαβάσει πρώτα από το /etc/bash.bashrc, ακολουθούμενο από το ~/.bashrc. Οι μη διαδραστικές περίοδοι λειτουργίας διαβάζουν τη μεταβλητή περιβάλλοντος που ονομάζεται BASH_ENV για να λάβουν το όνομα του αρχείου που θα χρησιμοποιηθεί για τον ορισμό του νέου περιβάλλοντος.
Υλοποίηση μεταβλητών περιβάλλοντος
Όταν ορίζετε τις μεταβλητές σας, να σημειώνετε πάντα σε ποιο αρχείο τις τοποθετείτε με βάση τη συζήτησή μας παραπάνω. Αυτό θα παρέχει ευελιξία, διασφαλίζοντας ότι ορισμένες μεταβλητές είναι διαθέσιμες μόνο σε συγκεκριμένες περιόδους λειτουργίας. Δεν θέλετε να λείπει μια κρίσιμη μεταβλητή από μια περίοδο λειτουργίας.
Σε ορισμένες περιπτώσεις, θέλουμε η μεταβλητή να υπάρχει τόσο σε περιόδους λειτουργίας σύνδεσης όσο και χωρίς σύνδεση. Ευτυχώς, οι περισσότερες διανομές Linux από προεπιλογή έχουν διαμορφώσει τις ρυθμίσεις σύνδεσης ώστε να διαβάζουν τις ρυθμίσεις χωρίς σύνδεση και να τις καθιστούν διαθέσιμες στις διεργασίες σας. Επομένως, μπορείτε απλά να ορίσετε τις μεταβλητές σας στα αρχεία ρυθμίσεων χωρίς σύνδεση. Συνήθως, ορίζουμε μεταβλητές περιβάλλοντος ειδικά για τον χρήστη και θέλουμε οι ρυθμίσεις μας να είναι διαθέσιμες τόσο σε περιόδους λειτουργίας κελύφους σύνδεσης όσο και χωρίς σύνδεση. Για το λόγο αυτό, θα χρησιμοποιήσουμε το αρχείο ~/.bashrc. Θα χρησιμοποιήσουμε το nano για να επεξεργαστούμε το αρχείο. Εισαγάγετε τα ακόλουθα στο τερματικό σας για να ανοίξετε το αρχείο:
|
1 |
nano ~/.bashrc |
Στο ανοιχτό αρχείο ρυθμίσεων, μπορείτε ήδη να δείτε αρκετές μεταβλητές. Μπορείτε να προσθέσετε μεταβλητές περιβάλλοντος με τον ίδιο τρόπο που το κάνετε όταν χρησιμοποιείτε τη γραμμή εντολών. Απλώς πληκτρολογήστε την εντολή:
|
1 |
export KEYNAME=value. |
Μπορείτε να τις προσθέσετε οπουδήποτε στο αρχείο—σε μια νέα γραμμή, και όχι μέσα σε μια συνάρτηση βρόχου. Στη συνέχεια, αποθηκεύστε και κλείστε το αρχείο. Οποιαδήποτε επόμενη συνεδρία κελύφους ξεκινήσετε θα διαβάζει από το αρχείο. Εάν θέλετε το τρέχον κέλυφος να διαβάσει τις ρυθμίσεις που μόλις προσθέσατε χωρίς να χρειαστεί να το επανεκκινήσετε, μπορείτε να χρησιμοποιήσετε την εντολή:
|
1 |
source ~/.bashrc |
Θα πρέπει να προσθέσετε μεταβλητές περιβάλλοντος συστήματος σε οποιοδήποτε από τα ακόλουθα: /etc/profile, /etc/bash.bashrc ή /etc/environment.
Συνοψίζοντας
Τέλος, μπορείτε πλέον να ορίσετε μεταβλητές κελύφους και περιβάλλοντος και να απολαύσετε τη μεγάλη ισχύ που φέρνουν αυτά τα εργαλεία στο VPS σας! Έχει πολλά πλεονεκτήματα, όπως η αυτοματοποίηση της εκτέλεσης ορισμένων διεργασιών, ή η αυτόματη διαμόρφωση ανάπτυξης που απαιτεί πληροφορίες ελέγχου ταυτότητας, η μεταβίβαση μεταβλητών σε θυγατρικές διεργασίες και πολλά άλλα. Οι μεταβλητές περιβάλλοντος σάς βοηθούν να αποκρύψετε ευαίσθητα δεδομένα, όπως πληροφορίες ελέγχου ταυτότητας, από δημόσια αποθετήρια μεταξύ άλλων δεδομένων. Με αυτή τη βάση, μπορείτε να δημιουργήσετε πολύπλοκα σενάρια που μπορείτε να εκτελέσετε αυτόματα μέσω της γραμμής εντολών χωρίς να απαιτείται συνεχής εισαγωγή δεδομένων από τον χρήστη.
Καλή συνέχεια!
Σχόλια
Δεν υπάρχουν σχόλια ακόμα. Γράψτε το πρώτο.