दिलचस्प पोस्ट
अवैध निष्पादन अपवाद या NullPointerException एक शून्य पैरामीटर के लिए? एसक्यूएल के जरिए टाइप टाइम की एक योग की गणना करें पोर्ट्रेट पर वापस घूमते वक्त एंड्रॉइड विडियो वीव भ्रष्टाचार से बचें सीएसएस दृश्यता काम क्यों नहीं कर रही है? क्रोम रेंडरिंग समस्या शरीर में उल के साथ निश्चित स्थिति एंकर जावा में अंतिम सरणी स्ट्रिंग से ट्यूपल को पार्स करते हैं? Matlab में चर के रूप में i और j का उपयोग करना कैसे पहचानने के लिए कि एक स्ट्रिंग में यूनिकोड वर्ण हैं? क्या INotifyPropertyChanged को लागू करते समय विकल्पों की तुलना में धीमा है? कुंज: jQuery के 2 संस्करण स्थापित करें CodeIgniter: "आप अपलोड करने का प्रयास कर रहे फ़ाइल प्रकार की अनुमति नहीं है।" एक साझा साझा फ़ोल्डर में जीआईटी रेपो में संगतता ट्रैफिकस्टैट्स एपीआई एंड्रॉइड और दैनिक डेटा उपयोग की गणना न्यूटनसफ्ट। जेसन विधानसभा संघर्ष

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

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

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

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

Solutions Collecting From Web of "मैं मूल प्रक्रिया की कार्यशील निर्देशिका कैसे सेट करूं?"

ऐसा मत करो

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 की सामग्री को कार्यशील निर्देशिका में बदल दे। एक आदेश चलाता है पैच में, आप एक पूरी तरह से नई बैश में बिल्ट-इन कमांड लागू कर सकते हैं जो आपकी आवश्यकताओं के अनुरूप है और प्रोटोकॉल को कार्यान्वित करता है जिसे आप लागू करना चाहते हैं (यह नया आदेश संभवतः बाश बैनर द्वारा स्वीकार नहीं किया जाएगा)। लेकिन, निजी इस्तेमाल के लिए और एक छोटे समुदाय में इस्तेमाल करने के लिए काम करना पट्टी करना