ค้นหาเว็บไซต์

เรียนรู้ความแตกต่างระหว่าง $$และ $BASHPID ใน Bash


เมื่อเร็ว ๆ นี้ฉันกำลังทำงานกับเชลล์สคริปต์และฉันเห็นความแตกต่างอย่างมีนัยสำคัญในลักษณะการทำงานของตัวแปรพิเศษ bash $ และ BASHPID ทุกกระบวนการที่ทำงานใน Linux จะถูกกำหนดด้วยกระบวนการ ID และนั่นคือวิธีที่ระบบปฏิบัติการจัดการกับกระบวนการ

ในทำนองเดียวกัน เซสชันเทอร์มินัล bash ของคุณจะถูกกำหนดด้วยรหัสกระบวนการด้วย มีตัวแปรพิเศษที่เรียกว่า "$" และ "$BASHPID" ซึ่งเก็บ ID กระบวนการของเชลล์ปัจจุบัน

ไปข้างหน้าและรันคำสั่งด้านล่างเพื่อดูว่า ID กระบวนการของเชลล์ปัจจุบันของคุณคืออะไร ทั้ง "$" และ "$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

เอาล่ะ มันจะส่งคืน ID กระบวนการเดียวกัน นี่คือความแตกต่างที่แท้จริง มาสร้างกระบวนการลูกอื่นภายในสคริปต์โดยการรันคำสั่งภายใน วงเล็บ()

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 ซึ่งเป็น ID หลัก (ID กระบวนการของสคริปต์ sample.sh) และ $BASHPID เก็บรหัสกระบวนการลูกที่สร้างขึ้นซึ่งสร้างโดยวงเล็บ

ตอนนี้เรามาลองทำความเข้าใจพฤติกรรมนี้กัน เราจะดูว่าหน้าคนพูดว่าอย่างไร

man bash

เมื่อคุณใช้ $ แม้จะอยู่ในเชลล์ย่อย มันจะเก็บ ID กระบวนการของกระบวนการหลักที่มันถูกสร้างขึ้นมา แต่ BASHPID จะเก็บ ID กระบวนการปัจจุบัน กล่าวคือ เมื่อเรียกภายในวงเล็บก็จะเก็บ ID กระบวนการย่อย

เราไม่สามารถกำหนดหรือแก้ไขตัวแปร $ ได้ แต่ BASHPID สามารถกำหนดใหม่ได้ แต่ไม่มีผลกระทบใด ๆ

$=10
BASHPID=10
echo $BASHPID

สามารถยกเลิกการตั้งค่า BASHPID ได้ เมื่อคุณยกเลิกการตั้งค่า มันจะสูญเสียสถานะพิเศษ และคุณสามารถเริ่มใช้สิ่งนี้เป็นตัวแปรปกติได้

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

แม้ว่าคุณจะพยายามกำหนด ID กระบวนการของเชลล์ มันก็จะถือเป็นตัวแปรที่ผู้ใช้กำหนดเนื่องจากสูญเสียสถานะพิเศษไปแล้ว

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

ในกรณีนี้ คุณต้องใช้เซสชันเทอร์มินัลใหม่สำหรับ BASHPID เพื่อรับสถานะพิเศษ

เพียงเท่านี้สำหรับบทความนี้ เราได้เห็นความแตกต่างระหว่าง $ และ BASHPID และลักษณะการทำงานของพวกมันในบทความนี้ อ่านบทความนี้และแบ่งปันความคิดเห็นอันมีค่าของคุณกับเรา