/ proc / self คือน้ำตาลประโยค มันเป็นทางลัดสำหรับ contatenating / proc / และผลลัพธ์ของ getpid () syscall (สามารถเข้าถึงได้ใน bash เป็น metavariable $$) มันอาจทำให้เกิดความสับสนในกรณีของการเขียนสคริปต์เชลล์เนื่องจากคำสั่งจำนวนมากเรียกใช้กระบวนการอื่นพร้อมด้วย PID ของตัวเอง ... PID ที่อ้างถึงบ่อยครั้งกว่ากระบวนการที่ไม่ทำงาน พิจารณา:
root@vps01:~# ls -l /proc/self/fd
total 0
lrwx------ 1 root root 64 Jan 1 01:51 0 -> /dev/pts/0
lrwx------ 1 root root 64 Jan 1 01:51 1 -> /dev/pts/0
lrwx------ 1 root root 64 Jan 1 01:51 2 -> /dev/pts/0
lr-x------ 1 root root 64 Jan 1 01:51 3 -> /proc/26562/fd
root@vps01:~# echo $$
593
'/ bin / ls' จะประเมินเส้นทางไปยังไดเรกทอรีแก้ไขเป็น / proc / 26563 เนื่องจากเป็น PID ของกระบวนการ - กระบวนการที่สร้างขึ้นใหม่ / bin / ls ซึ่งอ่านเนื้อหาของไดเรกทอรี แต่เมื่อถึงเวลาที่กระบวนการถัดไปในไพพ์ไลน์ในกรณีของการเขียนสคริปต์เชลล์หรือตามเวลาที่พรอมต์กลับมาในกรณีของเชลล์เชิงโต้ตอบเส้นทางจะไม่มีอยู่อีกต่อไปและเอาต์พุตข้อมูลหมายถึงกระบวนการที่ไม่มีอยู่
อย่างไรก็ตามจะใช้กับคำสั่งภายนอกเท่านั้น (ไฟล์ที่เป็นไฟล์โปรแกรมที่เรียกใช้งานได้จริงซึ่งต่างจากการสร้างไว้ในเชลล์เอง) ดังนั้นคุณจะได้ผลลัพธ์ที่แตกต่างถ้าคุณใช้ชื่อไฟล์ globbing เพื่อรับรายการเนื้อหาของไดเรกทอรีแทนที่จะส่งชื่อพา ธ ไปยังกระบวนการ / bin / ls ภายนอก:
root@vps01:~# ls /proc/self/fd
0 1 2 3
root@vps01:~/specs# echo /proc/self/fd/*
/proc/self/fd/0 /proc/self/fd/1 /proc/self/fd/2 /proc/self/fd/255 /proc/self/fd/3
ในบรรทัดแรกเชลล์วางกระบวนการใหม่ '/ bin / ls' ผ่าน exec () syscall ผ่าน "/ proc / self / fd" เป็น argv [1] '/ bin / ls' ในที่สุดก็เปิดไดเรกทอรี / proc / self / fd และอ่านแล้วพิมพ์เนื้อหาในขณะที่มันซ้ำแล้วซ้ำอีกพวกเขา
อย่างไรก็ตามบรรทัดที่สองใช้ glob () ด้านหลังฉากเพื่อขยายรายการชื่อไฟล์ สิ่งเหล่านี้จะถูกส่งเป็นอาร์เรย์ของสตริงเพื่อสะท้อน (โดยปกติจะใช้เป็นคำสั่งภายใน แต่มักจะมี / bin / echo binary ... แต่ส่วนนั้นไม่เกี่ยวข้องจริง ๆ เนื่องจาก echo นั้นเกี่ยวข้องกับสตริงเท่านั้นจึงไม่เคยดึงข้อมูลไปยัง syscall ใด ๆ ที่เกี่ยวข้องกับชื่อพา ธ )
ตอนนี้ให้พิจารณากรณีต่อไปนี้:
root@vps01:~# cd /proc/self/fd
root@vps01:~# ls
0 1 2 255
นี่คือเปลือกที่การปกครองของ / bin / LS ได้ทำไดเรกทอรีย่อยของ proc / A / ตนเองไดเรกทอรีปัจจุบัน ดังนั้นชื่อพา ธ ที่สัมพันธ์กันจะถูกประเมินจากมุมมองของมัน สิ่งที่ดีที่สุดที่ฉันคาดเดาได้คือสิ่งนี้เกี่ยวข้องกับความหมายของไฟล์ POSIX ซึ่งคุณสามารถสร้างฮาร์ดลิงก์หลายลิงก์ไปยังไฟล์รวมถึงตัวอธิบายไฟล์ที่เปิดอยู่ ดังนั้นเวลานี้ / bin / ls จึงทำงานคล้ายกับ echo / proc / $$ / fd / *
/proc/self
แน่นอน