बैश एक अलग निर्देशिका संदर्भ में एक कमांड को कैसे निष्पादित कर सकता है?


94

मेरे पास एक सामान्य कमांड है जिसे बहुत विशिष्ट निर्देशिकाओं के भीतर से बुलाया जाता है। इस कार्यक्रम के लिए केवल एक निष्पादन योग्य / बिन में बैठे हैं, और इसे सही ढंग से चलाने के लिए वर्तमान कार्य निर्देशिका बहुत महत्वपूर्ण है। स्क्रिप्ट उन फ़ाइलों को प्रभावित करती है जो उस निर्देशिका के अंदर रहती हैं, जिसे उसके भीतर चलाया जाता है।

अब, मेरे पास एक कस्टम शेल स्क्रिप्ट भी है जो कुछ चीजों को एक डायरेक्टरी में करती है, लेकिन मुझे उस कमांड को ऊपर वर्णित करने की आवश्यकता है जैसे कि वह किसी अन्य डायरेक्टरी में थी।

आप इसे शेल स्क्रिप्ट में कैसे करते हैं?


जवाबों:


39

आप इस उद्देश्य के लिए बिलिन cd, pushdऔर popdबिलिन का उपयोग कर सकते हैं । उदाहरण के लिए:

# do something with /etc as the working directory
cd /etc
:

# do something with /tmp as the working directory
cd /tmp
:

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


4
cd -पिछली निर्देशिका में वापस बदलने के लिए POSIX शेल में भी है। उस ने कहा, (ए) pushdऔर popdवास्तव में इंटरएक्टिव उपयोग के लिए अभिप्रेत है, और (बी) यह मान लेना हमेशा सुरक्षित नहीं होता है कि आप cdजहां आप शुरू कर सकते हैं , विशेष रूप से जटिल उप-प्रणालियों में जो आंतरिक रूप से प्रतिबंधात्मक अनुमतियों का उपयोग कर सकते हैं (देखें stackoverflow.com/questions/) 10555284 /… )।
१२'१२

3
एक
उपखंड

पटकथा के लिए, एक उपशैल शायद एक बेहतर विचार है .. हालाँकि मैं इसके बारे में जानने के लिए वास्तव में खुश हूं popd
कंबोडोड

क्या आप कृपया बता सकते हैं कि :प्रतीक का यहाँ क्या अर्थ है?
वादिम कोटोव

2
@VadimKotov मुझे लगता है कि यह प्रभावी रूप से एक सेशन नहीं है। रीड्स का प्रासंगिक खंड man bash: : [arguments]कोई प्रभाव नहीं; आदेश तर्कों का विस्तार करने और किसी निर्दिष्ट पुनर्निर्देशन का प्रदर्शन करने से परे कुछ नहीं करता है। वापसी की स्थिति शून्य है।
लड़का

218

cdएक उपधारा में उपयोग करें ; इस तरह के उपखंड का उपयोग करने का आशुलिपि तरीका कोष्ठक है।

(cd wherever; mycommand ...)

उस ने कहा, यदि आपके आदेश में ऐसा वातावरण है, जिसकी आवश्यकता है, तो उसे वास्तव में उस पर्यावरण को किसी भी चीज़ पर रखने के बजाय यह सुनिश्चित करना चाहिए कि वह इसका उपयोग करना चाहता है (जब तक कि यह एक अच्छी तरह से संदर्भ में बहुत विशिष्ट परिस्थितियों में उपयोग किया जाने वाला आंतरिक आदेश न हो। परिभाषित बड़ी प्रणाली, जैसे कि किसी भी कॉलर को पहले से ही पर्यावरण को सुनिश्चित करने की आवश्यकता होती है)। आमतौर पर यह किसी प्रकार का शेल स्क्रिप्ट रैपर होगा।


आप एक ही संदर्भ में मल्टी-लाइन कमांड के लिए \प्रत्येक ;के बाद भी सम्मिलित कर सकते हैं ।
चिरमिसु


20

यदि आप अपनी वर्तमान कार्यशील निर्देशिका में वापस जाना चाहते हैं:

current_dir=$PWD;cd /path/to/your/command/dir;special command ARGS;cd $current_dir;
  1. हम current_dirआपके बराबर एक चर सेट कर रहे हैंpwd
  2. उसके बाद हम वह जगह जा रहे हैं cdजहाँ आपको अपनी कमांड चलाने की आवश्यकता है
  3. तो हम कमांड चला रहे हैं
  4. फिर हम cdअपने वैरिएबल पर वापस जा रहे हैंcurrent_dir

एक अन्य उपाय @aphewofbart द्वारा pushd && YOUR COMMAND && popd


4
या आप कर सकते हैंpushd && YOUR COMMAND && pulld
एपिफ़िशबार्ट

4
@apiblofbart मुझे लगता है कि आप के popdबजाय इसका मतलब था pulld
कॉन्सटेंटिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.