/ proc / स्वयं वाक्यगत शर्करा है। यह contatenating / proc / और getpid () syscall (metavariable $$ के रूप में बाश में सुलभ) के परिणाम के लिए एक शॉर्टकट है। यह शेल स्क्रिप्टिंग के मामले में भ्रामक, थओ हो सकता है, क्योंकि कई बयान अन्य प्रक्रियाओं को लागू करते हैं, स्वयं पीआईडी के साथ पूर्ण ... पीआईडी जो संदर्भित करते हैं, अधिक बार नहीं, मृत प्रक्रियाओं से। विचार करें:
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 है - नव निर्मित / बिन / ls प्रक्रिया - जो निर्देशिका की सामग्री को पढ़ती है। लेकिन उस समय तक पाइपलाइन में अगली प्रक्रिया, शेल स्क्रिप्टिंग के मामले में, या जब तक प्रॉम्प्ट वापस आता है, एक इंटरेक्टिव शेल के मामले में, पथ अब मौजूद नहीं है और सूचना आउटपुट एक गैर-प्रासंगिक प्रक्रिया को संदर्भित करता है।
यह केवल बाहरी आदेशों पर लागू होता है, हालांकि (जो वास्तविक निष्पादन योग्य प्रोग्राम फाइलें हैं, जैसा कि शेल में ही निर्मित होने के विपरीत है)। इसलिए, यदि आप कहते हैं, तो आपको अलग-अलग परिणाम मिलेंगे, यदि आप बाहरी सामग्री / बिन / 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
पहली पंक्ति में, शेल ने एक नई प्रक्रिया '/ / बिन / ls' को अंजाम दिया () syscall, argv [1] के रूप में "/ proc / self / fd" पास करके। '/ बिन / एलएस', बदले में, निर्देशिका / proc / स्व / fd खोला और पढ़ा, फिर मुद्रित, इसकी सामग्री के रूप में यह उन पर iterated।
दूसरी पंक्ति, हालांकि, फिल्नाम की सूची का विस्तार करने के लिए पर्दे के पीछे ग्लोब () का उपयोग करती है; इनको गूँज के रूप में पारित किया जाता है। (आमतौर पर एक आंतरिक कमांड के रूप में लागू किया जाता है, लेकिन अक्सर एक / बिन / प्रतिध्वनी बाइनरी भी होती है ... लेकिन यह वास्तव में अप्रासंगिक है, क्योंकि प्रतिध्वनि केवल तारों के साथ काम कर रही है जो पथ नामों से संबंधित किसी भी syscall को कभी नहीं खिलाती है।)
अब, निम्नलिखित मामले पर विचार करें:
root@vps01:~# cd /proc/self/fd
root@vps01:~# ls
0 1 2 255
यहां, शेल, / बिन / एलएस की मूल प्रक्रिया , ने अपनी वर्तमान निर्देशिका को / proc / self की उपनिर्देशिका बना दिया है । इस प्रकार, सापेक्ष मार्ग का मूल्यांकन उसके दृष्टिकोण से किया जाता है। मेरा सबसे अच्छा अनुमान यह है कि यह POSIX फाइल शब्दार्थ से संबंधित है जहां आप किसी भी फाइल के लिए कई हार्ड लिंक बना सकते हैं, जिसमें कोई भी ओपन फाइल डिस्क्रिप्टर शामिल है। तो इस बार, / बिन / ls समान रूप से प्रतिध्वनि / proc / $ $ / fd / * व्यवहार करता है।
/proc/self
, निश्चित रूप से।