ฉันมีปัญหากับ Bash และฉันไม่รู้ว่าทำไม
ภายใต้เปลือกฉันป้อน:
echo $$ ## print 2433
(echo $$) ## also print 2433
(./getpid) ## print 2602
"getpid" เป็นโปรแกรม C เพื่อรับ pid ปัจจุบันเช่น:
int main() { printf("%d", (int)getpid()); return 0; }
สิ่งที่ทำให้ฉันสับสนคือ:
- ฉันคิดว่า "(คำสั่ง)" เป็นกระบวนการย่อย (ฉันใช่มั้ย) และฉันคิดว่า pid ของมันควรจะแตกต่างจาก pid ของผู้ปกครอง แต่พวกเขาเหมือนกันทำไม ...
- เมื่อฉันใช้โปรแกรมของฉันเพื่อแสดง pid ระหว่างวงเล็บ, pid ที่มันแสดงนั้นแตกต่างกันใช่ไหม?
- '$$' คล้ายแมโครหรือไม่
คุณสามารถช่วยฉันได้ไหม?
echo $$ $BASHPID ; ( echo $$ $BASHPID )
แสดงให้เห็นว่ามันทำ วงเล็บเหลี่ยมจะสร้าง subshell คำสั่งอาจเปลี่ยนค่าตัวแปรและเชลล์พาเรนต์ต้องไม่เห็นการเปลี่ยนแปลงเหล่านั้น สิ่งนี้ถูกนำไปใช้เป็นการfork()
ดำเนินการ
getpid
จะแสดง ID กระบวนการที่แตกต่างกันแม้ว่าจะไม่ได้ทำงานใน subshell