Μάθετε τη διαφορά μεταξύ προμήθειας και διοχέτευσης στο Bash
Ο κύριος στόχος αυτού του άρθρου είναι να κατανοήσουμε με σαφήνεια τι συμβαίνει όταν εκτελείτε το script vs source το σενάριο στο bash. Πρώτον, θα κατανοήσουμε ξεκάθαρα πώς υποβάλλεται το πρόγραμμα όταν καλείτε το σενάριο με διαφορετικούς τρόπους.
ΣΗΜΕΙΩΣΗ: η δημιουργία του σεναρίου με επέκταση δεν έχει σημασία. Το σενάριο θα εκτελείται άψογα ακόμα και χωρίς επεκτάσεις.
Βασικά, κάθε σενάριο ξεκινά με μια γραμμή που ονομάζεται shebang(#!). Το σύμβολο Hash στο bash θα ερμηνευτεί ως σχόλια, αλλά το shebang έχει ιδιαίτερη σημασία. Λέει στον bash να υποβάλει το πρόγραμμα σε όποιον διερμηνέα αναφέρατε στο shebang.
Παρακάτω είναι ένα δείγμα προγράμματος και προσδιορίζω το bash ως διερμηνέα μου.
cat >> Hello_World.sh
#!/usr/bin/env bash
echo "Hello world"
chmod +x Hello_world.sh
Τώρα για να εκτελέσετε το σενάριο, μπορείτε να το κάνετε με δύο τρόπους.
- Χρησιμοποιήστε μια σχετική διαδρομή για να καλέσετε το σενάριο. Μεταβείτε στον κατάλογο όπου υπάρχει το σενάριο και εκτελέστε το ./Hello_world.sh.
- Χρησιμοποιήστε την απόλυτη διαδρομή για να καλέσετε το σενάριο. Από οπουδήποτε στο σύστημα αρχείων πληκτρολογήστε την πλήρη διαδρομή προς το σενάριο.
./Hello_world.sh
pwd
/home/karthick/Hello_world
Ας δούμε τώρα τι συμβαίνει όταν προσπαθείτε να υποβάλετε το πρόγραμμά σας χωρίς shebang. Εάν δεν υπάρχει shebang, το πρόγραμμα θα υποβληθεί σε οποιοδήποτε τρέχον κέλυφος με το οποίο εκτελείτε, στην περίπτωσή μου, είναι Bash (/bin/bashισχυρή>).
Επιτρέψτε μου να δείξω ένα παράδειγμα. Δημιουργώ ένα σενάριο python χωρίς shebang και όταν καλώ το πρόγραμμα, ο bash δεν γνωρίζει ότι πρέπει να υποβάλει αυτό το πρόγραμμα στον διερμηνέα της python, αντί να εκτελέσει το πρόγραμμα στο τρέχον κέλυφος.
cat > run-py.py
echo $SHELL
print("Hello world")
chmod +x run-py.py
./run-py.py
Σε αυτήν την περίπτωση, μπορείτε να καλέσετε το πρόγραμμα αναφέροντας σε ποιον διερμηνέα θα πρέπει να υποβληθεί ή απλώς να προσθέσετε τη γραμμή shebang που συνιστάται πάντα.
which python3
$(which python3) /home/karthick/run_py.py
Τώρα που ξέρετε πώς να καλέσετε το σενάριο, το επόμενο βήμα θα ήταν να καταλάβετε τι συμβαίνει όταν καλούμε το σενάριο. Όταν καλείτε το σενάριο όπως φαίνεται στα παραπάνω παραδείγματα, θα δημιουργηθεί μια θυγατρική διαδικασία (forking) και το σενάριο θα υποβληθεί στη θυγατρική διαδικασία. Έτρεξα ένα δείγμα σεναρίου που θα εκτελέσει απλώς την ακόλουθη εντολή και δείχνει ότι το σενάριο έχει υποβληθεί σε μια θυγατρική διαδικασία.
ps -ef --forest | grep -i bash
Μπορεί να υπάρχουν πολλές θυγατρικές διεργασίες ως μέρος του σεναρίου και αυτό εξαρτάται από τον κώδικά μας. Πρέπει να σημειωθεί ότι οι περιβαλλοντικές μεταβλητές που δημιουργούνται από τον δείκτη θα απορριφθούν μόλις ολοκληρωθεί. Μια θυγατρική διεργασία μπορεί να έχει πρόσβαση σε μεταβλητές που δημιουργούνται από τη γονική διεργασία εξάγοντάς τις. Αλλά η γονική διαδικασία δεν μπορεί να έχει πρόσβαση στις μεταβλητές που δημιουργούνται από τη θυγατρική διαδικασία.
Ρίξτε μια ματιά στα παρακάτω άρθρα για να κατανοήσετε περισσότερα σχετικά με τον τρόπο λειτουργίας των μεταβλητών και τον τρόπο εξαγωγής των μεταβλητών.
- Κατανόηση και σύνταξη «Μεταβλητών Linux» στο Shell Scripting
- Μάθετε τη διαφορά μεταξύ $$και $BASHPID στο Bash
Προμήθεια του Σεναρίου
Η "Πηγή " είναι μια ενσωματωμένη εντολή φλοιού που διαβάζει το αρχείο που μεταβιβάζεται ως όρισμα σε αυτό και εκτελεί τον κώδικα στο τρέχον περιβάλλον του κελύφους. Μια κατάλληλη περίπτωση χρήσης που χρησιμοποιείτε κυρίως είναι να τροποποιήσετε τη διαμόρφωσή σας στο .bashrc
ή στο .bash_profile
και να φορτώσετε ξανά τις αλλαγές χρησιμοποιώντας την εντολή πηγής.
type -a source
Υπάρχουν δύο συντακτικοί τρόποι εκτέλεσης της εντολής πηγής. Μπορείτε να επιλέξετε οποιονδήποτε από δύο συντάξεις και είναι προσωπικής επιλογής.
source FILE_NAME [ARGUMENTS]
. FILE_NAME [ARGUMENTS]
Επιτρέψτε μου να δείξω πώς λειτουργεί πραγματικά η πηγή. Θα δημιουργήσω δύο σενάρια φλοιού. Το πρώτο σενάριο (Module.sh) πρόκειται να περιέχει ορισμένες μεταβλητές και συναρτήσεις. Το δεύτερο σενάριο (Main.sh) πρόκειται να εκτυπώσει τη μεταβλητή και να καλέσει τη συνάρτηση.
Αρχείο Module.sh.
#!/usr/bin/env bash
VAR1=$(echo "Welcome to $1")
function f1(){
echo “Function f1 is called”
}
Αρχείο Main.sh.
#!/usr/bin/env bash
echo $VAR1
f1
Ορίστε την άδεια εκτέλεσης για το σενάριο και καλέστε το κύριο σενάριο “main.sh ”. Τώρα, αυτό το σενάριο θα προσπαθήσει να βρει τη συνάρτηση f1
και τη μεταβλητή VAR1
στο τρέχον περιβάλλον του κελύφους και θα αποτύχει με την εντολή δεν βρέθηκε.
bash main.sh
Τώρα ας εκτελέσουμε την εντολή πηγής μέσα στο σενάριο που θα φορτώσει τη μεταβλητή και τις λειτουργίες στο τρέχον περιβάλλον του κελύφους και θα είναι προσβάσιμη από το “main.sh ”.
Αρχείο Module.sh.
#!/usr/bin/env bash
VAR1=$(echo "Welcome to $1")
function f1(){
echo "Function f1 is called"
}
Αρχείο Main.sh.
#!/usr/bin/env bash
source module.sh Tecmint
echo $VAR1
f1
Τώρα εκτελέστε ξανά το σενάριο και δείτε.
bash main.sh
Η πηγή είναι πολύ χρήσιμη στο bash για να ακολουθήσουμε την προσέγγιση του αρθρωτού προγραμματισμού κατά τη δημιουργία των σεναρίων κελύφους μας. Μπορούμε να σπάσουμε τον κώδικά μας σε μικρότερες ενότητες και μπορεί να χρησιμοποιηθεί σε πολλά προγράμματα. Με αυτούς τους τρόπους, μπορούμε να ακολουθήσουμε την αρχή DRY (Don’t Repeat Yourself).
Αυτό είναι για αυτό το άρθρο. Συζητήσαμε εν συντομία τη διαφορά μεταξύ της προμήθειας και της διοχέτευσης στο bash. Διαβάστε το άρθρο και μοιραστείτε τα πολύτιμα σχόλιά σας μαζί μας.