Στο μικρό αυτό σημείωμα θα δούμε τη διαφορά ανάμεσα στους τρόπους με τους οποίους με τους οποίους μπορείς να καλέσεις ένα Bash script
Τι είναι ένα Bash script
Έχουμε ήδη εδώ πει κάποια πράγματα. Αν δεν τα έχεις διαβάσει ρίξε μια ματιά εδώ πρώτα
Αν βάλουμε τις εντολές που γράφουμε στο τερματικό σε ένα αρχείο κειμένου, τότε έχουμε φτιάξει ένα προγραμμα κελύφους
. Είναι εύκολο
Ωραία άλλα είπες δυο τρόπους ποιοι είναι αυτοί;
Ας υποθέσουμε πως έχουμε ένα αρχείο με τα παρακάτω στο αρχείο test.sh
που είναι εκτελέσιμο
#!/usr/bin/env bash
var1="Hello"
export var2="Welcome"
echo $var1 $1 $var2
Αν δώσω ./test.sh linux
τον κατάλογο που είναι το αρχείο θα δω στο τερματικό:
Hello linux Welcome
Δεν κάνω κάτι παράξενο, απλά βάζω σε 2 μεταβλητές τη var1
και τη var2
και τις τυπώνω μαζί με μια μεταβλητή με όνομα 1
που είναι η παράμετρος που δίνω. Για να αναφερθώ στην τιμή που έχουν κοτσάρω μπροστά ένα $
.
Αλλά υπάρχει και ένας άλλος τρόπος. Να δώσω
source ./test.sh linux
Θα πάρω ακριβώς το ίδιο πράγμα. Είναι οι δύο τρόποι ισοδύναμοι και αν όχι ποια είναι η διαφορά τους; Και τι κάνει αυτό το μυστήριο export
;
Η μέθοδος source
Κατ αρχήν ο δεύτερος τρόπος θα τρέξει ακόμα και αν το αρχείο δεν έχει γίνει εκτελέσιμο με την εντολή chmod +x ./test.sh
. Αλλά η κυριότερη διαφορά είναι πως στη δεύτερη περίπτωση θα τρέχει στο ίδιο bash
, δεν θα υπάρχει καμία διαφορά με το να γράψω τις εντολές στο τερματικό.
Δοκιμάστε να το τρέξετε με τη δεύτερη μέθοδο. Οι μεταβλητές θα υπάρχουν και μετά την εκτέλεση. Μπορούμε να το δούμε αν γράψουμε στο τερματικό echo $var1
. Δοκιμάστε το
Σαν script
Κάντε την ίδια δοκιμή, αλλά προσοχή!! σε ένα άλλο τερματικό. Αφήστε το υπάρχον τερματικό άνοιχτό. Μετά την εκτέλεση με ./test.sh linux
θα δούμε πως δεν υπάρχουν ορισμένες οι μεταβλητές. Δοκιμάστε να τις τυπώσετε. Δε θα δείτε τίποτα. Η εκτέλεση την εντολής αυτή τη φορά άφησε το κέλυφος ανεπηρέαστο.
Τι κάνει το export
Τώρα και στα δύο τερματικά δώστε την εντολή bash
. Ξαναδοκιμάστε να τυπώσετε τις δύο μεταβλητές. Θα δείτε πως μόνο η μεταβλητή με το όνομα var2
(αυτή που κάνατε export) θα μείνει στο τερματικό που κάνατε source
. Τι στο καλό συμβαίνει;
Η λύση στο μυστήριο
Όπως τα αρχεία είναι οργανωμένα στον δίσκο ιεραρχικά σε φακέλους το ίδιο και τα προγράμματα που τρέχουν. Διαβάστε
Αν τρέξω το αρχείο σαν πρόγραμμα αυτό θα τρέξει σε ένα άλλο bash
σαν διαφορετικό πρόγραμμα. Το πρόγραμμα αυτό θα είναι μέσα στον φάκελο με τις διεργασίες κάτω από το bash που τρέχω. Για αυτό τον λόγο δεν επηρεάζει το αρχικό bash.
To δεύτερο μυστήριο έχει να κάνει με τα κληρονομικά. Τα προγράμματα κληρονομούν το περιβάλλον των πατεράδων τους. Η εντολή export
μαρκάρει μια μεταβλητή σαν κληρονομήσιμη.
Τώρα που τα ξεκαθαρίσαμε αυτά, ξαναδιαβάστε το κείμενο να βγάλει νόημα.
Τι με νοιάζουν εμένα αυτά;
Κάποιες φορές θέλουμε να αλλάξουμε το περιβάλλον του κελύφους που είμαστε. Στην περίπτωση αυτή θα πρέπει να είμαστε βέβαιοι να χρησιμοποιήσουμε τη μέθοδο source
. Αν ακολουθείτε οδηγίες που σας το λένε αυτό, τώρα ξέρετε το γιατί.
Πουφ, σε ακούω να λες: «Εγώ θα βάζω πάντα source και καθάρισα». Αυτό φίλε μου είναι πραγματικά μια πολύ κακή ιδέα.
Ω η φρίκη: exec
, eval
, source
, bash -c
, eval $(cat filename)…
Τα βάσανα ποτέ δεν τελειώνουν, και υπάρχουν και άλλοι τρόποι να τρέξεις κώδικα μέσα από ένα κέλυφος. Δε θα αναλύσω τους τρόπους και τις διαφορές τους, αλλά αν τις ψάξεις θα πρέπει να βρεις τις απαντήσεις σε δυο ερωτήματα: α) Τι εντολές θα τρέξει και β) Θα τις τρέξει στο ίδιο κέλυφος ή σε ένα υποκέλυφος. Δε θα επεκταθώ παρακάτω, κατέχεις τώρα το πλαίσιο για να καταλάβεις τι μπορει να συμβαίνει, αν και όταν θέλεις να ασχοληθείς παραπάνω.
Αν τώρα από τα παραπάνω δεν κατάλαβες λέξη,δεν υπάρχει κανένας λόγος για πανικό. Δεν έχεις φτάσει στο σημείο να σου χρειαστούν και μάλλον δε θα σου χρειαστούν ποτέ.