เรียนรู้ความแตกต่างระหว่าง $$และ $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
และลักษณะการทำงานของพวกมันในบทความนี้ อ่านบทความนี้และแบ่งปันความคิดเห็นอันมีค่าของคุณกับเรา