Πώς και γιατί θα χρησιμοποιούσατε την μεταβλητή $ SHLVL

Η μεταβλητή $ SHLVL χρησιμοποιείται για να σας πει πόσα βαθιά κοχύλια είστε. Εάν συγχέεται από αυτό αξίζει να ξεκινάτε από την αρχή.

Τι είναι μια Shell;

Ένα κέλυφος παίρνει εντολές και τους δίνει στο υποκείμενο λειτουργικό σύστημα να εκτελέσει. Στα περισσότερα συστήματα Linux το πρόγραμμα κελύφους ονομάζεται BASH (The Bourne Again Shell) αλλά υπάρχουν και άλλοι διαθέσιμοι, όπως το C Shell (tcsh) και το κέλυφος KORN (ksh).

Πώς να αποκτήσετε πρόσβαση στο Linux Shell

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

Εάν εκτελείτε έναν διαχειριστή παραθύρων, όπως το Openbox ή ένα περιβάλλον επιφάνειας εργασίας όπως το GNOME ή το KDE, θα βρείτε έναν εξομοιωτή τερματικού είτε από ένα μενού είτε από μια παύλα. Σε πολλά συστήματα, η συντόμευση CTRL ALT και T θα ανοίξει επίσης ένα παράθυρο τερματικού.

Εναλλακτικά, μπορείτε να μεταβείτε σε άλλο tty (teletypewriter) που παρέχει άμεση πρόσβαση σε κέλυφος γραμμής εντολών. Μπορείτε να το κάνετε πατώντας CTRL ALT και F1 ή CTRL ALT και F2 κ.λπ.

Τι είναι το επίπεδο Shell

Όταν εκτελείτε μια εντολή σε ένα κέλυφος, τρέχει σε κάτι που ονομάζεται επίπεδο κελύφους. Μέσα σε ένα κέλυφος μπορείτε να ανοίξετε ένα άλλο κέλυφος το οποίο το καθιστά ένα υποκείμενο ή το κέλυφος που το άνοιξε.

Επομένως, το γονικό κέλυφος θα θεωρείται ίσως το κέλυφος επιπέδου 1 και το κέλυφος παιδιού θα ήταν κέλυφος επιπέδου 2.

Πώς να εμφανίσετε το Επίπεδο Shell

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

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

echo $ SHLVL

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

Αν όμως τρέξετε την ίδια εντολή χρησιμοποιώντας το tty τότε το αποτέλεσμα είναι 1.

Γιατί συμβαίνει κάτι τέτοιο; Καλά το περιβάλλον επιφάνειας εργασίας που τρέχετε τρέχει πάνω από ένα κέλυφος. Το κέλυφος θα είναι επίπεδο 1. Κάθε παράθυρο τερματικού που ανοίγετε μέσα σε αυτό το περιβάλλον επιφάνειας εργασίας θα πρέπει να είναι ένα παιδί του κελύφους που άνοιξε το περιβάλλον επιφάνειας εργασίας και ως εκ τούτου το επίπεδο κελύφους δεν μπορεί να ξεκινήσει σε οποιοδήποτε αριθμό εκτός από 2.

Το tty δεν εκτελεί περιβάλλον επιφάνειας εργασίας και επομένως είναι απλώς επίπεδο 1 shell.

Πώς να δημιουργήσετε υποσύνολα

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

echo $ SHLVL

Όπως γνωρίζουμε από ένα παράθυρο τερματικού, το ελάχιστο επίπεδο κελύφους είναι 2.

Τώρα μέσα στο παράθυρο του τερματικού, πληκτρολογήστε τα εξής:

SH

Η εντολή sh από μόνη της εκτελεί ένα διαδραστικό κέλυφος που σημαίνει ότι χρησιμοποιείτε ένα κέλυφος μέσα σε ένα κέλυφος ή ένα υποκεφάλαιο.

Αν τώρα πληκτρολογήσετε ξανά αυτό το μήνυμα:

echo $ SHLVL

Θα δείτε ότι το επίπεδο κελύφους είναι ρυθμισμένο στο 3. Το τρέξιμο της εντολής sh από το εσωτερικό του υποσέλιδου θα ανοίξει ένα υποσύνολο του υποσέλιδου και έτσι το επίπεδο κελύφους θα είναι στο επίπεδο 4.

Γιατί το επίπεδο Shell είναι σημαντικό;

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

Ας ξεκινήσουμε με κάτι απλό:

σκύλος = maisie
echo $ dog

Εάν εκτελέσετε την παραπάνω εντολή σε ένα κέλυφος, η λέξη maisie θα εμφανιστεί στο παράθυρο του τερματικού.

Ανοίξτε ένα νέο κέλυφος πληκτρολογώντας τα εξής:

SH

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

echo $ dog

Αυτό συμβαίνει επειδή η μεταβλητή σκυλιών $ είναι διαθέσιμη μόνο στο επίπεδο κελύφους 2. Εάν πληκτρολογήσετε exit για να βγείτε από το υποκεφάλαιο και εκτελέσετε echo $ dog ξανά, η λέξη maisie θα εμφανιστεί ξανά.

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

Ξεκινήστε με ένα νέο παράθυρο τερματικού και πληκτρολογήστε τα εξής:

σκύλος εξαγωγής = maisie
echo $ dog

Όπως θα περίμενε κανείς ότι θα εμφανιστεί η λέξη maisie. Τώρα ανοίξτε ένα υποσύνολο και πληκτρολογήστε ξανά το σκύλο echo $. Αυτή τη φορά θα δείτε ότι η λέξη maisie εμφανίζεται ακόμα κι αν βρίσκεστε σε ένα υποσέλιδο.

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

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

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