Μάθετε τη διαφορά μεταξύ $$και $BASHPID στο Bash


Πρόσφατα δούλευα σε ένα σενάριο φλοιού και είδα μια σημαντική διαφορά στον τρόπο συμπεριφοράς της ειδικής μεταβλητής bash $ και BASHPID. Σε κάθε διεργασία που εκτελείται στο Linux θα εκχωρηθεί ένα αναγνωριστικό διαδικασίας και αυτός είναι ο τρόπος με τον οποίο το λειτουργικό σύστημα χειρίζεται τη διαδικασία.

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

Προχωρήστε και εκτελέστε την παρακάτω εντολή για να δείτε ποιο είναι το αναγνωριστικό διεργασίας του τρέχοντος κελύφους σας. Τόσο το "$" και το "$BASHPID" θα επιστρέψουν την ίδια τιμή.

echo $$               # Printing special variable $
echo $BASHPID         # Printing the varibale $BASHPID

Στο bash όταν καλούμε οποιοδήποτε εξωτερικό πρόγραμμα από το κέλυφος, θα δημιουργήσει μια θυγατρική διεργασία/υποφλοιό και το πρόγραμμα θα υποβληθεί μόνο στη θυγατρική διαδικασία. Δείτε παρακάτω παράδειγμα όπου έβαλα μια απλή εντολή παρακολούθησης διεργασιών σε ένα σενάριο που ονομάζεται “sample.sh” για να δείξω πώς το γονικό κέλυφος δημιουργεί ένα υποκέλυφος για την εκτέλεση του προγράμματος.

#!/usr/bin/env bash

ps -ef --forest | grep -i bash

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

./sample.sh

Τώρα ας χρησιμοποιήσουμε τόσο το "$" και το "$BASHPID" μέσα στο σενάριο και ας δούμε τι επιστρέφει.

#!/usr/bin/env bash
echo "============================"
ps -ef --forest | grep -i bash
echo "============================"
echo "PID USING $ FOR SCRIPT $0 ==> $$"
echo "PID USING BASHPID FOR SCRIPT $0 ==> $BASHPID"
echo

Τώρα εκτελέστε ξανά το σενάριο.

./sample.sh

Εντάξει, επιστρέφει το ίδιο αναγνωριστικό διαδικασίας. Εδώ έρχεται η πραγματική διαφορά. Ας δημιουργήσουμε μια άλλη θυγατρική διαδικασία μέσα στο σενάριο εκτελώντας μια εντολή μέσα στο parentheses().

STORING THE PID INTO A VARIABLE…

VAR_HASH=$(echo $$)
VAR_BASHPID=$(echo $BASHPID)

echo "VALUE OF VAR_HASH ==> $VAR_HASH"
echo "VALUE OF VAR_BASHPID ==> $VAR_BASHPID"

Στο bash, οι Παρενθέσεις θα καλέσουν μια θυγατρική διαδικασία και θα εκτελέσουν ό,τι βρίσκεται μέσα στις παρενθέσεις. Σε αυτήν την περίπτωση, τόσο το $ όσο και το $BASHPID θα πρέπει να αποθηκεύουν ένα νέο αναγνωριστικό θυγατρικής διαδικασίας. Αλλά από την παραπάνω εικόνα, μπορείτε να δείτε ότι υπάρχει μια διαφορά όπου το $ αποθηκεύει το 382 που είναι το αναγνωριστικό γονέα (Αναγνωριστικό διαδικασίας του σεναρίου sample.sh), και το $BASHPID αποθηκεύει το αναγνωριστικό θυγατρικής διεργασίας που δημιουργήθηκε από παρενθέσεις.

Τώρα ας προσπαθήσουμε να κατανοήσουμε αυτή τη συμπεριφορά. Θα δούμε τι λέει η σελίδα man.

man bash

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

Δεν μπορούμε να εκχωρήσουμε ή να τροποποιήσουμε τη μεταβλητή $, αλλά το BASHPID μπορεί να εκχωρηθεί εκ νέου αλλά δεν έχει αποτέλεσμα.

$=10
BASHPID=10
echo $BASHPID

Είναι δυνατή η απενεργοποίηση του BASHPID. Όταν καταργήσετε τη ρύθμιση, χάνει την ειδική του κατάσταση και μπορείτε επίσης να αρχίσετε να τη χρησιμοποιείτε ως κανονική μεταβλητή.

unset BASHPID
echo $BASHPID
BASHPID="Tecmint"
echo $BASHPID

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

BASHPID=$(echo $$)
echo $$;echo $BASHPID

Σε αυτήν την περίπτωση, πρέπει να χρησιμοποιήσετε μια νέα περίοδο λειτουργίας τερματικού για το BASHPID για να αποκτήσετε την ειδική του κατάσταση.

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