Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม BASH

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

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

อ่านที่เกี่ยวข้อง :เรียนรู้ความแตกต่างระหว่างการจัดหาและการ Forking ใน Bash

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

ไปข้างหน้าและเรียกใช้คำสั่งด้านล่างเพื่อดูว่า ID กระบวนการของเชลล์ปัจจุบันของคุณคืออะไร ทั้ง "$" และ "$BASHPID" กำลังจะคืนค่าเดิม

$ echo $$               # Printing special variable $
$ echo $BASHPID         # Printing the varibale $BASHPID
เรียนรู้ความแตกต่างระหว่าง $$ และ $BASHPID ใน Bash

ใน bash เมื่อเราเรียกโปรแกรมภายนอกใดๆ จากเชลล์ มันจะสร้างโปรเซสลูก/เชลล์ย่อย และโปรแกรมจะถูกส่งไปที่โพรเซสลูกเท่านั้น ดูตัวอย่างด้านล่างที่ฉันใส่คำสั่งตรวจสอบกระบวนการอย่างง่ายในสคริปต์ชื่อ “sample.sh” เพื่อสาธิตวิธีที่ parent shell สร้าง subshell เพื่อรันโปรแกรม

#!/usr/bin/env bash

ps -ef --forest | grep -i bash

ตอนนี้ในการรันสคริปต์นี้เราสามารถรับ ID กระบวนการของ bash จากภาพด้านล่าง คุณสามารถเข้าใจได้เมื่อฉันเรียกสคริปต์ bash สร้างโปรเซสลูกและรันสคริปต์

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

ตอนนี้ใช้ทั้ง "$" และ "$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
เรียนรู้ความแตกต่างระหว่าง $$ และ $BASHPID ใน Bash เรียนรู้ความแตกต่างระหว่าง $$ และ $BASHPID ใน Bash

เอาล่ะ มันจะส่งคืน 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"
เรียนรู้ความแตกต่างระหว่าง $$ และ $BASHPID ใน Bash เรียนรู้ความแตกต่างระหว่าง $$ และ $BASHPID ใน Bash

ใน bash วงเล็บ จะเรียกใช้กระบวนการลูกและเรียกใช้สิ่งที่อยู่ในวงเล็บ ในกรณีนั้นทั้ง $ และ $BASHPID ควรเก็บ ID กระบวนการลูกใหม่ แต่จากภาพด้านบน จะเห็นว่า $ . มีความแตกต่างกัน ร้านค้า 382 ซึ่งเป็นรหัสหลัก (ID กระบวนการของสคริปต์ sample.sh ) และ $BASHPID เก็บ ID โปรเซสลูกที่สร้างขึ้นโดยวงเล็บ

ทีนี้มาพยายามทำความเข้าใจพฤติกรรมนี้กัน เราจะเห็นสิ่งที่ man page พูด

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

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

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

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

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

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

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

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

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

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