Πώς να ορίσετε μεταβλητές περιβάλλοντος στο Bash στο Linux

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

Πώς λειτουργούν οι μεταβλητές περιβάλλοντος

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

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

Θα σας δείξουμε πώς μπορείτε να δείτε τις μεταβλητές περιβάλλοντος που υπάρχουν στο σύστημά σας και θα περιγράψουμε πώς να δημιουργήσετε τις δικές σας. Θα σας δείξουμε επίσης πώς να τα κάνετε διαθέσιμα σε θυγατρικές διεργασίες και να είστε επίμονοι κατά τις επανεκκινήσεις.

Περιβάλλοντα και Κληρονομικότητα

Όταν ένα κέλυφος ξεκινά, περνάει από μια φάση αρχικοποίησης. Σε αυτό το σημείο διαβάζει τις μεταβλητές περιβάλλοντος που ορίζουν το περιβάλλον του κελύφους.

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

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

Παγκόσμια Μεταβλητές Περιβάλλοντος

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

SHELL: Το όνομα του κελύφους που θα ξεκινήσει όταν ανοίξετε ένα παράθυρο τερματικού. Στις περισσότερες διανομές Linux, αυτό θα είναι bash εκτός αν το αλλάξεις από την προεπιλογή.
ΟΡΟΣ: Τα παράθυρα τερματικού είναι στην πραγματικότητα προσομοιώσεις ενός τερματικού υλικού. Αυτό περιλαμβάνει τον τύπο του τερματικού υλικού που θα γίνει εξομοίωση.
ΧΡΗΣΤΗΣ: Το όνομα χρήστη του τρέχοντος ατόμου που χρησιμοποιεί το σύστημα.
PWD: Η διαδρομή προς τον τρέχοντα κατάλογο εργασίας.
OLDPWD: Ο κατάλογος στον οποίο βρισκόσασταν πριν μετακινηθείτε στον τρέχοντα κατάλογο εργασίας.
LS_COLORS: Η λίστα των χρωματικών κωδικών που χρησιμοποιούνται από το ls επισημάνετε διαφορετικούς τύπους αρχείων.
MAIL: Εάν το σύστημα αλληλογραφίας έχει ρυθμιστεί στον υπολογιστή σας Linux (από προεπιλογή, δεν είναι), αυτό θα κρατήσει το διαδρομή προς το γραμματοκιβώτιο του τρέχοντος χρήστη.
PATH: Μια λίστα καταλόγων στους οποίους θα αναζητήσει το κέλυφος για να βρει εκτελέσιμα εντολές.
LANG: Οι ρυθμίσεις γλώσσας, τοπικής προσαρμογής και κωδικοποίησης χαρακτήρων.
HOME: Ο αρχικός κατάλογος του τρέχοντος χρήστη.
_: Η μεταβλητή περιβάλλοντος υπογράμμισης (_) περιέχει την τελευταία εντολή που πληκτρολογήθηκε.

  Το Shadow of War στο Linux

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

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

echo $SHELL
echo $LANG
echo $HOME
echo $PWD

Για να δημιουργήσετε τις δικές σας καθολικές μεταβλητές περιβάλλοντος, προσθέστε τις στο αρχείο /etc/environment. Θα χρειαστεί να χρησιμοποιήσετε το sudo για να επεξεργαστείτε αυτό το αρχείο:

sudo gedit /etc/environment

Για να προσθέσετε μια μεταβλητή περιβάλλοντος, πληκτρολογήστε το όνομά της, ένα σύμβολο ίσου (=) και την τιμή που θέλετε να διατηρεί η μεταβλητή περιβάλλοντος. Μην αφήνετε κενό διάστημα πριν ή μετά το σύμβολο ίσου (=). Το όνομα της μεταβλητής περιβάλλοντος μπορεί να περιέχει γράμματα, μια κάτω παύλα (_) ή αριθμούς. Ωστόσο, ο πρώτος χαρακτήρας ενός ονόματος δεν μπορεί να είναι αριθμός.

Εάν υπάρχουν κενά στην τιμή, φροντίστε να περικλείσετε ολόκληρη την τιμή σε εισαγωγικά (“).

Αποθηκεύστε το αρχείο και, στη συνέχεια, αποσυνδεθείτε και συνδεθείτε ξανά. Χρησιμοποιήστε το echo για να ελέγξετε ότι υπάρχει μια νέα μεταβλητή και διατηρεί την τιμή που έχετε ορίσει:

echo $WEBSITE

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

echo $WEBSITE

Προς το δείτε όλες τις μεταβλητές περιβάλλοντος αμέσως, πληκτρολογήστε printenv. Υπάρχει πολλή έξοδος, επομένως είναι λογικό να το ταξινομήσετε και μετά σε λιγότερα:

printenv | sort | less

Η ταξινομημένη λίστα μεταβλητών περιβάλλοντος εμφανίζεται για εμάς σε λιγότερα.

Μπορούμε να διοχετεύσουμε την έξοδο μέσω του grep για να αναζητήσουμε μεταβλητές περιβάλλοντος που σχετίζονται με ένα συγκεκριμένο θέμα.

printenv | grep GNOME

Μεταβλητές Περιβάλλοντος Shell

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

BASHOPTS: Οι επιλογές της γραμμής εντολών που χρησιμοποιήθηκαν κατά την εκκίνηση του bash.
BASH_VERSION: Ο αριθμός έκδοσης bash ως σειρά λέξεων και αριθμών.
BASH_VERSINFO: Η έκδοση bash ως ψηφίο.
COLUMNS: Το τρέχον πλάτος του παραθύρου του τερματικού.
DIRSTACK: Οι κατάλογοι που έχουν γίνει προστέθηκε στη στοίβα καταλόγου με την εντολή ώθησης.
HISTFILESIZE: Μέγιστος αριθμός γραμμές που επιτρέπονται στο αρχείο ιστορικού.
HISTSIZE: Αριθμός γραμμών ιστορικού που επιτρέπεται στη μνήμη.
HOSTNAME: Το όνομα κεντρικού υπολογιστή του υπολογιστή.
IFS: Το Διαχωριστής εσωτερικού πεδίου χρησιμοποιείται για τον διαχωρισμό εισόδου στη γραμμή εντολών. Από προεπιλογή, αυτό είναι ένα διάστημα.
PS1: Η μεταβλητή περιβάλλοντος PS1 περιέχει τον ορισμό για την κύρια, την προεπιλεγμένη και τη γραμμή εντολών. Ένα σύνολο διακριτικών που ονομάζονται ακολουθίες διαφυγής μπορεί να συμπεριληφθεί στον ορισμό της γραμμής εντολών σας. Αντιπροσωπεύουν πράγματα όπως ο κεντρικός υπολογιστής και το όνομα χρήστη, ο τρέχων κατάλογος εργασίας και η ώρα.
ΥΓ2: Όταν μια εντολή εκτείνεται σε περισσότερες από μία γραμμές και αναμένονται περισσότερες είσοδοι, εμφανίζεται η δευτερεύουσα γραμμή εντολών. Η μεταβλητή περιβάλλοντος PS2 περιέχει τον ορισμό αυτής της δευτερεύουσας προτροπής, η οποία, από προεπιλογή, είναι το σύμβολο μεγαλύτερο από (>).
SHELLOPTS: Επιλογές κελύφους που μπορείτε να ορίσετε χρησιμοποιώντας την επιλογή set.
UID: Το Αναγνωριστικό χρήστη του τρέχοντος χρήστη.

  Πώς να ρυθμίσετε το Rsync σε Linux

Ας ελέγξουμε μερικές από αυτές τις μεταβλητές φλοιού:

echo $BASH_VERSION
echo $HOSTNAME
echo $COLUMNS
echo $HISTFILESIZE
echo $UID

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

t: Η τρέχουσα ώρα, μορφοποιημένη ως ΩΩ:ΛΛ:ΔΔ.
δ: Η τρέχουσα ημερομηνία, εκφρασμένη ως ημέρα της εβδομάδας, μήνας, ημερομηνία.
n: Ένας χαρακτήρας νέας γραμμής.
s: Το όνομα του κελύφους σας.
W: Το όνομα του τρέχοντος καταλόγου εργασίας σας.
w: Η διαδρομή προς τον τρέχοντα κατάλογο εργασίας σας.
u: Το όνομα χρήστη του ατόμου που είναι συνδεδεμένο.
h: Το όνομα κεντρικού υπολογιστή του υπολογιστή.
#: Κάθε εντολή μέσα σε ένα κέλυφος είναι αριθμημένη. Αυτό σας επιτρέπει να δείτε τον αριθμό της εντολής στη γραμμή εντολών σας. Αυτό δεν είναι το ίδιο με τον αριθμό που θα έχει η εντολή στη λίστα ιστορικού.
$: Ορίζει τον τελικό χαρακτήρα της προτροπής σε ένα σύμβολο δολαρίου ($) για έναν κανονικό χρήστη και ένα σύμβολο κατακερματισμού (#) για τον χρήστη root. Αυτό λειτουργεί ελέγχοντας το UID του χρήστη. Εάν είναι μηδέν, ο χρήστης είναι root.

Θα βρείτε τον ορισμό της μεταβλητής περιβάλλοντος PS1 στο αρχείο σας .bashrc.

Δημιουργία μεταβλητών περιβάλλοντος συνεδρίας

Για να δημιουργήσετε μεταβλητές περιβάλλοντος για δική σας χρήση, προσθέστε τις στο κάτω μέρος του αρχείου .bashrc. Εάν θέλετε να έχετε τις μεταβλητές περιβάλλοντος διαθέσιμες σε απομακρυσμένες συνεδρίες, όπως συνδέσεις SSH, θα πρέπει να τις προσθέσετε και στο αρχείο .bash_profile.

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

gedit .bashrc

Προσθέσαμε μια μεταβλητή περιβάλλοντος που ονομάζεται INHERITED_VAR. Σημειώστε τη λέξη «εξαγωγή» στην αρχή της γραμμής.

Αποθηκεύστε και κλείστε το αρχείο σας αφού ολοκληρώσετε την επεξεργασία. Θα μπορούσατε να αποσυνδεθείτε και να συνδεθείτε ξανά ή μπορείτε να κάνετε το κέλυφος να διαβάσει ξανά το αρχείο .bash_profile χρησιμοποιώντας την εντολή dot (.) ως εξής:

. .bashrc

Τώρα, ας δημιουργήσουμε μια μεταβλητή περιβάλλοντος στη γραμμή εντολών:

LOCAL_VAR="This session only"

LOCAL_VAL=

Εάν χρησιμοποιήσουμε echo, μπορούμε να δούμε ότι και οι δύο μεταβλητές περιβάλλοντος είναι προσβάσιμες σε εμάς:

echo $LOCAL_VAR
echo $INHERITED_VAR

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

bash
echo $LOCAL_VAR
echo $INHERITED_VAR

Όπως μπορείτε να δείτε, το INHERITED_VAR είναι προσβάσιμο στο θυγατρικό κέλυφος, αλλά το LOCAL_VAR δεν είναι. Παίρνουμε απλώς μια κενή γραμμή.

Παρόλο που η “εξαγωγή” προσθέτει το τμήμα της μεταβλητής περιβάλλοντος στο περιβάλλον που κληρονομεί η επεξεργασία του παιδιού, το INHERITED_VAR δεν είναι μια καθολική μεταβλητή περιβάλλοντος. Για παράδειγμα, ο χρήστης mary δεν μπορεί να το αναφέρει:

echo $INHERITED_VAR

Για να κλείσουμε τη συνεδρία παιδικού bash, χρησιμοποιούμε την έξοδο:

exit

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

#!/bin/bash

echo "WEBSITE" $WEBSITE
echo "LOCAL_VAR" $LOCAL_VAR
echo "INHERITED_VAR" $INHERITED_VAR

Αυτό αποθηκεύτηκε σε ένα αρχείο που ονομάζεται envtest.sh και στη συνέχεια έγινε εκτελέσιμο με τα εξής:

chmod +x envtest.sh

Όταν εκτελούμε το σενάριο, μπορεί να έχει πρόσβαση σε δύο από τις τρεις μεταβλητές περιβάλλοντος:

./envtest.sh

Το σενάριο μπορεί να δει την καθολική μεταβλητή περιβάλλοντος WEBSITE και την εξαγόμενη μεταβλητή περιβάλλοντος INHERITED_VAR. Δεν μπορεί να έχει πρόσβαση στο LOCAL_VAR, παρόλο που το σενάριο εκτελείται στο ίδιο κέλυφος όπου δημιουργήθηκε η μεταβλητή.

  7 λόγοι για τους οποίους πρέπει να μεταβείτε σε Linux

Εάν χρειάζεται, μπορούμε να εξαγάγουμε μια μεταβλητή περιβάλλοντος από τη γραμμή εντολών. Θα το κάνουμε αυτό στο LOCAL_VAR και, στη συνέχεια, θα εκτελέσουμε ξανά το σενάριο:

export LOCAL_VAR
./envtest.sh

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

Απομακρυσμένες συνδέσεις

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

(Με κίνδυνο σύγχυσης, υπάρχει επίσης ένα αρχείο .profile. Μπορεί επίσης να περιέχει ορισμούς μεταβλητών περιβάλλοντος. Ωστόσο, το αρχείο .profile δεν διαβάζεται εάν υπάρχει το αρχείο .bash_profile. Επομένως, το πιο ασφαλές πράγμα που μπορείτε να κάνετε—και ο τρόπος συμβατός με το bash—είναι να χρησιμοποιήσετε το αρχείο .bash_profile.)

Για να επεξεργαστούμε το αρχείο .bash_profile, θα χρησιμοποιήσουμε ξανά το gedit:

gedit .bash_profile

Θα προσθέσουμε την ίδια μεταβλητή περιβάλλοντος με την ίδια τιμή που χρησιμοποιούσαμε πριν.

Αποθηκεύστε τις αλλαγές σας και κλείστε το gedit.

Σε άλλον υπολογιστή, θα κάνουμε ένα SSH σύνδεση με τον δοκιμαστικό υπολογιστή.

ssh [email protected]

Μόλις συνδεθούμε, θα εκτελέσουμε ξανά το σενάριο:

./envtest.sh

Το αρχείο .bash_profile έχει διαβαστεί ως μέρος της προετοιμασίας της απομακρυσμένης σύνδεσης και η μεταβλητή περιβάλλοντος INHERITED_VAR είναι προσβάσιμη σε εμάς και το σενάριο.

Κατάργηση ρύθμισης μιας μεταβλητής περιβάλλοντος

Για να καταργήσετε τη ρύθμιση μιας μεταβλητής περιβάλλοντος χρησιμοποιήστε το εντολή unset. Εάν καταργήσουμε την καθολική μεταβλητή περιβάλλοντος, WEBSITE, και τη μεταβλητή περιβάλλοντος που εξάγεται, INHERITED_VAR, δεν θα είναι πλέον διαθέσιμες στη γραμμή εντολών, ούτε σε θυγατρικές διεργασίες:

unset WEBSITE
unset INHERITED_VAR
./envtest.sh
echo $WEBSITE

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

Για παράδειγμα, ο χρήστης mary μπορεί ακόμα να έχει πρόσβαση στη μεταβλητή περιβάλλοντος WEBSITE και να διαβάσει την τιμή της, παρόλο που ο χρήστης dave την έχει απενεργοποιήσει στην περίοδο λειτουργίας του:

echo $WEBSITE

Περιβαλλοντικός Έλεγχος

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