Bash: Διαφορά μεταξύ script και source

Στο μικρό αυτό σημείωμα θα δούμε τη διαφορά ανάμεσα στους τρόπους με τους οποίους με τους οποίους μπορείς να καλέσεις ένα 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)…

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

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

5 «Μου αρέσει»