สิ่งสำคัญคือต้องเข้าใจว่าทุกกระบวนการมีชุดตัวแปรสภาพแวดล้อมของตัวเอง
เมื่อกระบวนการเรียกการเรียกของfork()ระบบกระบวนการที่สอง ( ลูก ) เหมือนกันเป็นครั้งแรก ( แม่ ) ถูกสร้างขึ้น ( สำเนานี้รวมถึงสภาพแวดล้อมซึ่งอยู่เหนือกอง (หรือด้านล่างขึ้นอยู่กับวิธีที่คุณคิดว่าสแต็ค:-)-) แต่ใน Unix / Linux สแต็คที่เติบโตลดลงจากที่อยู่สูง)
โดยปกติแล้วกระบวนการลูกจะเรียกการเรียกของexecve()ระบบซึ่งจะทิ้งทุกอย่างในหน่วยความจำ (เสมือน) และสร้างใหม่จากรหัสและส่วนข้อมูลในไฟล์ไบนารีที่ระบุ
แต่เมื่อมันreconstructsกองสำเนาสภาพแวดล้อมและการโต้แย้งสตริงส่งผ่านไปexecve()บนสแต็คเป็นครั้งแรก (ตามลำดับ) ก่อนการเรียกmain()ฟังก์ชั่น (จำนวนมากของการทำงานจะทำในcrt0รหัสบูตหลังจากที่execve()ผลตอบแทน (ไปยังรายการ จุดที่ระบุไว้ในไบนารี))
มีห่อสำหรับที่มีexecve()การเรียกระบบในห้องสมุด C ที่จะผ่านสภาพแวดล้อมในปัจจุบัน (เช่นคัดลอกของสภาพแวดล้อมของผู้ปกครอง) แทนของผู้โทรให้มัน (เพื่อให้มีผลบังคับใช้เด็กจะได้รับมรดกของสภาพแวดล้อมของผู้ปกครอง) - environ(7)ดู
ลองใช้คำสั่ง (เป็น root) ps axeww | less... ซึ่งจะแสดงสภาพแวดล้อมสำหรับกระบวนการทั้งหมด ! สิ่งที่น่าสนใจคือ id ของกระบวนการ 1 (เช่นinitกระบวนการ - กระบวนการแรกที่สร้างโดยเคอร์เนลในเวลาบูต)
หากคุณต้องการดูสภาพแวดล้อมของกระบวนการเฉพาะ (และคุณรู้ว่าเป็นรหัสกระบวนการ) ให้ลองเรียกใช้คำสั่งcat /proc/<PID>/environ(แทนที่<PID>ด้วยรหัสกระบวนการ)
โปรดทราบว่าหากโปรเซสมีสิทธิ์เพียงพอก็สามารถเขียนสแต็คของตัวเองใหม่ซึ่งทำให้ยากที่จะรู้ว่าสภาพแวดล้อมคืออะไร - คุณจะเห็นกระบวนการ daemon บางอย่างเช่นนี้ในเอาต์พุต ps
แต่ในท้ายที่สุดวาฟเฟิลทั้งหมดจะเดือดร้อนถึงสิ่งที่ @chaos กล่าวไว้ข้างต้นหากคุณต้องการดูค่าปัจจุบันของตัวแปรสภาพแวดล้อมที่เฉพาะเจาะจงในกระบวนการเชลล์ของคุณเพียงใช้คำสั่งecho "$<NAME>"( builtin) (แทนที่<NAME>ด้วยชื่อของ ตัวแปรสภาพแวดล้อมที่คุณสนใจ) ... โปรดทราบว่าตัวแปรเดียวกันอาจมีค่าแตกต่างกันหรือไม่มีเลยในกระบวนการอื่น
echoเป็นตัวเลือกที่ไม่ดีของคำสั่งเนื่องจากสามารถแปลงเนื้อหาของตัวแปรได้ มันจะส่งออกเนื้อหาของพารามิเตอร์เปลือกด้วยชื่อเดียวกัน นั่นคือไม่จำเป็นต้องเหมือนกันถ้าใช้บอร์นเปลือกหรือ env vars เช่น1,*ตัวอย่างเช่น และคุณไม่สามารถใช้วิธีการนั้นสำหรับ env vars ที่ชื่อไม่ถูกต้องเป็นชื่อตัวแปรเชลล์