दिलचस्प पोस्ट
सी-स्टाइल सरणी से std :: vector को कैसे प्रारंभ करें? कैसे एक बास स्क्रिप्ट में बहस को पुनरावृति करना एकाधिक तालिकाओं में रिकॉर्ड जोड़ने के लिए फ़ॉर्म बनाएं क्रॉस-ब्राउज़र (IE8-) जावास्क्रिप्ट के साथ संक्रमित शैली प्राप्त करें? बैच फ़ाइल में स्ट्रिंग की लंबाई कैसे प्राप्त करें? एक्सएमएल नोड जावा से एक्सपेथ बनाएं / प्राप्त करें जावास्क्रिप्ट में तारीख बनाम नई तारीख डेटा को क्षैतिज रूप से सॉर्ट करने के लिए bash का उपयोग करना जावास्क्रिप्ट का उपयोग कर नए पेज को लोड किए बिना ब्राउजर में यूआरएल बदलें एक जनरेटर समझ कैसे काम करता है? पुनरावृत्ति में सीएसएस एनीमेशन विलंब मैं बेस 64 एन्कोडेड स्ट्रिंग को कैसे डीकोड कर सकता हूं? अज्ञात आंतरिक वर्ग से बाहरी चर सेट करना int main () बनाम void main () सी में फ्लक्स ऐप में एजेक्स अनुरोध को कहाँ बनाया जाना चाहिए?

मैं मूल प्रक्रिया की कार्यशील निर्देशिका कैसे सेट करूं?

जैसा कि शीर्षक से पता चलता है, हम एक यूनिक्स-शैली वाली शेल उपयोगिता यू लिख रहे हैं जो कि बाश से (ज्यादातर मामलों में) लागू किया जाना चाहिए।

कैसे यू यू की कार्यशील निर्देशिका बदल सकता है (सामान्य रूप से या माता-पिता)?

पीएस शेल उपयोगिता chdir ठीक उसी में सफल होता है, इस प्रकार प्रभाव को प्राप्त करने का एक प्रोग्राममैटिक तरीका होना चाहिए।

वेब के समाधान से एकत्रित समाधान "मैं मूल प्रक्रिया की कार्यशील निर्देशिका कैसे सेट करूं?"

ऐसा मत करो

FILE *p; char cmd[32]; p = fopen("/tmp/gdb_cmds", "w"); fprintf(p, "call chdir(\"..\")\ndetach\nquit\n"); fclose(p); sprintf(cmd, "gdb -p %d -batch -x /tmp/gdb_cmds", getppid()); system(cmd); 

यह संभवतः काम करेगा, हालांकि ध्यान दें कि बैश की pwd कमांड कैश्ड है और नोटिस नहीं करेगा।

मूल प्रक्रिया 'वर्तमान निर्देशिका को प्रभावित करने का कोई "कानूनी" तरीका नहीं है जो सिर्फ मूल प्रक्रिया को स्वयं को बदलने के लिए कह रहा है

chdir जो बाश स्क्रिप्ट्स में निर्देशिका को बदलता है एक बाहरी उपयोगिता नहीं है, यह एक बिल्टिन कमांड है

आप वास्तव में कैसे bash (या सामान्य में माता पिता ) की कार्यशील निर्देशिका बदल सकते हैं?

किसी भी "स्वीकार्य" तरीके से इसका उपयोग करना संभव नहीं है स्वीकार्य द्वारा, मेरा मतलब है "बिना शर्त अपने सिस्टम को हैकिंग (उदाहरण के लिए gdb का प्रयोग करके)";)

अधिक गंभीरता से, जब उपयोगकर्ता निष्पादन योग्य प्रक्षेपण करता है, तो बच्चे की प्रक्रिया अपने स्वयं के वातावरण में चलती रहती है, जो कि ज्यादातर अपने मूल वातावरण की एक प्रति है। इस वातावरण में "पर्यावरण चर" के साथ-साथ "वर्तमान कार्यशील निर्देशिका" है, बस उन दो नामों के लिए।

बेशक, एक प्रक्रिया अपने स्वयं के वातावरण को बदल सकती है उदाहरण के लिए अपनी कार्यशील निर्देशिका (जैसा कि आप में cd xxx खोलें) बदलने के लिए। लेकिन जब यह पर्यावरण एक प्रति है , जो माता-पिता के पर्यावरण को किसी भी तरह से बदल नहीं पाता है। और आपके पैरेंट वातावरण को संशोधित करने का कोई मानक तरीका नहीं है।


एक साइड नोट के रूप में, यही कारण है कि cd ("chdir") एक आंतरिक शेल कमांड है, और बाहरी उपयोगिता नहीं है यदि यह मामला था, तो वह शेल की कार्यशील निर्देशिका को परिवर्तित नहीं कर पाएगा।

Chdir कमांड एक शेल अंतर्निहित है, इसलिए इसका संचालन करने वाले शेल की कार्यशील निर्देशिका तक सीधी पहुंच होती है। शैलियां आमतौर पर लिपियों के प्रभाव से स्वयं को बचाने में बहुत अच्छी होती हैं, जिससे बच्चे को अपने स्वयं के काम के माहौल की प्रतिलिपि पेश करती है। जब बच्ची प्रक्रिया से बाहर निकलती है, तो इसका इस्तेमाल किया जाने वाला वातावरण नष्ट हो जाता है।

एक चीज जो आप कर सकते हैं वह 'स्रोत' एक स्क्रिप्ट है यह आपको निर्देशिका को बदलने देता है क्योंकि संक्षेप में, आप शेल को फ़ाइल से आदेशों को निष्पादित करने के लिए कह रहे हैं जैसे कि आपने उन्हें सीधे टाइप किया था यानी, आप शैल के पर्यावरण की एक प्रति से काम नहीं कर रहे हैं, सोर्सिंग करते समय आप सीधे उस पर काम कर रहे हैं।

जिस तरह से मैं इसे हल करता हूं, वह एक शेल उपनाम होता है जो स्क्रिप्ट को कॉल करता है और एक फ़ाइल स्रोत बनाता है जिसे स्क्रिप्ट ने लिखा था। इसलिए, उदाहरण के लिए,

 function waypoint { python "$WAYPOINT_DIRECTORY"/waypoint.py $@ && source ~/.config/waypoint/scratch.sh cat /dev/null > ~/.config/waypoint/scratch.sh } 

और waypoint.py तरह देखने के लिए scratch.sh बनाता है

 cd /some/directory 

यह अभी भी एक बुरी बात है

यदि आप शेल को अन्तरक्रियाशील रूप से चला रहे हैं और लक्ष्य निर्देशिका स्थिर है, तो आप अपने उपनाम को ~/.bashrc फ़ाइल में डाल सकते हैं:

 alias cdfoo='cd theFooDir' 

गैर-इंटरैक्टिव शैल स्क्रिप्ट के साथ काम करते समय, आप पैतृक बैश स्क्रिप्ट और बच्चे बैश स्क्रिप्ट के बीच एक प्रोटोकॉल बना सकते हैं। इसे कार्यान्वित करने की एक विधि यह है कि बच्चे की स्क्रिप्ट को पथ को एक फ़ाइल में सहेजने दें (जैसे ~/.new-work-dir )। बच्चे की प्रक्रिया समाप्त होने के बाद, अभिभावकीय प्रक्रिया को इस फाइल को पढ़ने की आवश्यकता होगी (जैसे cd `cat ~/.new-work-dir` )

यदि आप पिछले पैराग्राफ में उल्लिखित नियम का प्रयोग करने की योजना बना रहे हैं, तो मैं आपको बैश स्रोत कोड डाउनलोड करने और उसे पैच करने का सुझाव देता हूं ताकि वह स्वचालित रूप से प्रत्येक समय के बाद ~/.new-work-dir की सामग्री को कार्यशील निर्देशिका में बदल दे। एक आदेश चलाता है पैच में, आप एक पूरी तरह से नई बैश में बिल्ट-इन कमांड लागू कर सकते हैं जो आपकी आवश्यकताओं के अनुरूप है और प्रोटोकॉल को कार्यान्वित करता है जिसे आप लागू करना चाहते हैं (यह नया आदेश संभवतः बाश बैनर द्वारा स्वीकार नहीं किया जाएगा)। लेकिन, निजी इस्तेमाल के लिए और एक छोटे समुदाय में इस्तेमाल करने के लिए काम करना पट्टी करना