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

ใน bash เมื่อเราเรียกโปรแกรมภายนอกใดๆ จากเชลล์ มันจะสร้างโปรเซสลูก/เชลล์ย่อย และโปรแกรมจะถูกส่งไปที่โพรเซสลูกเท่านั้น ดูตัวอย่างด้านล่างที่ฉันใส่คำสั่งตรวจสอบกระบวนการอย่างง่ายในสคริปต์ชื่อ “sample.sh” เพื่อสาธิตวิธีที่ parent shell สร้าง subshell เพื่อรันโปรแกรม
#!/usr/bin/env bash ps -ef --forest | grep -i bash
ตอนนี้ในการรันสคริปต์นี้เราสามารถรับ ID กระบวนการของ 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 กระบวนการเดียวกัน นี่คือความแตกต่างที่แท้จริง มาสร้างกระบวนการลูกอื่นภายในสคริปต์โดยเรียกใช้คำสั่งภายใน 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
ควรเก็บ ID กระบวนการลูกใหม่ แต่จากภาพด้านบน จะเห็นว่า $
. มีความแตกต่างกัน ร้านค้า 382 ซึ่งเป็นรหัสหลัก (ID กระบวนการของสคริปต์ sample.sh ) และ $BASHPID
เก็บ ID โปรเซสลูกที่สร้างขึ้นโดยวงเล็บ
ทีนี้มาพยายามทำความเข้าใจพฤติกรรมนี้กัน เราจะเห็นสิ่งที่ man page พูด
$ 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
และพฤติกรรมของพวกเขาในบทความนี้ อ่านบทความนี้และแบ่งปันความคิดเห็นอันมีค่าของคุณกับเรา