किसी विशेष निर्देशिका में किसी विशेष कमांड को cd'ing के बिना निष्पादित करें?


42

वहाँ एक अलग निर्देशिका में एक कमांड निष्पादित करने के लिए एक रास्ता cdहै यह करने के लिए बिना ? मुझे पता है कि मैं बस cdअंदर और cdबाहर जा सकता था, लेकिन मैं अतिरिक्त कदमों को आगे बढ़ाने की संभावनाओं में दिलचस्पी रखता हूं :)


यह ऐसा करने के लिए एक स्क्रिप्ट बनाने के बजाय तुच्छ है echo "#!/bin/bash; cd $1; exec $2" > /usr/local/bin/execindirectory; chmod +x /usr/local/bin/execindirectory:। यदि आप वास्तव में "टैग" जैसे विकल्प -dऔर सामान का समर्थन करना चाहते हैं, तो इसे थोड़ा और प्रयास करने की आवश्यकता हो सकती है ।
LawrenceC

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

जवाबों:


55

मुझे नहीं पता कि क्या यह मायने रखता है, लेकिन आप एक उपधारा बना सकते हैं:

$ (cd /var/log && cp -- *.log ~/Desktop)

निर्देशिका केवल उस उपधारा के लिए बदल जाती है, इसलिए आप cd -बाद में आवश्यकता के काम से बचते हैं ।


2
यही मैं आमतौर पर करता हूं।
एडम ब्रीटेक

अच्छा, मैं उप-गोले के बारे में पूरी तरह से भूल गया था, इस मामले में बहुत आसान है।
नातुल्ली काया

4
संभावित अराजकता से बचने के लिए, अर्धविराम को दो एम्परसेंड के साथ उप में जोड़ें $ (cd /var/log && cp *.log ~/Desktop):। इस तरह, यदि निर्देशिका मौजूद नहीं है, तो आगे कोई कमांड निष्पादित नहीं की जाती है।
नातुल्ली काई

मेरे जैसे किसी और के लिए ध्यान दें: शुरू में $ कमांड का हिस्सा नहीं है, बस इसके बाद सब कुछ।
माल्ट्रॉनिक

14

कुछ कार्यक्रमों विकल्पों जिसके साथ आप उन्हें बता सकते हैं chdir (2) खुद को (जैसे ग्नू टार के -C/ --directory)।

इस तरह के कार्यक्रमों के बाहर, हालांकि, कुछ chdir करना होगा । आप शेल को करने के बजाय किसी प्रकार के संकलित "बाइनरी" प्रोग्राम को लिख और उपयोग कर सकते हैं, लेकिन यह शायद बहुत लाभ नहीं देगा।

एक अन्य उत्तर में एक टिप्पणी में, आपने एक उदाहरण दिया:

execindirectory -d /var/log "cp *.log ~/Desktop"

चूँकि *.logपैटर्न शेल द्वारा ही विस्तारित किया गया है ( cp नहीं ), इसलिए शेल को आपके कमांड का मूल्यांकन करने से पहले कुछ को निर्देशिका में chdir करना होगा ।

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

(cd /path/to/dir && some command)

आप इसे शेल फ़ंक्शन में पैकेज कर सकते हैं। (मैं -dआपके उदाहरण के उपयोग से विकल्प को छोड़ देता हूं क्योंकि इस कमांड का कोई मतलब नहीं है अगर निर्देशिका वास्तव में वैकल्पिक है।)

runindir() { (cd "$1" && shift && eval "$@"); }

runindir /var/log 'cp *.log ~/Desktop'  # your example
runindir /var/log cp \*.log \~/Desktop  # eval takes multiple args

runindir /var/log cp \*.log ~/Desktop   # it is okay to expand tilde first

2
मैं इस समाधान को पसंद करता हूं, व्यक्तिगत रूप से, मैं पुशड / पॉपड का उपयोग करूंगा
एनजे

10

अन्य लोगों द्वारा दिए गए उत्तरों के मूल्य को कम करने के लिए नहीं, लेकिन मेरा मानना ​​है कि आप जो चाहते हैं वह यह है:

(cd /path/to && ./executable [ARGS])

cdएक उप-शेल में आह्वान करने के लिए पार्नस पर ध्यान दें ।


मुझे ऐसा नहीं लगता। जैसा कि मैं समझता हूं, वह प्रारंभिक निर्देशिका में समाप्त होना चाहता है।
एडम बायरटेक

ओह, मैं पूरी तरह से उप-शेल में लपेटना भूल गया। मेरा उत्तर सही किया, धन्यवाद।
एलेक्स

4

यहाँ कुछ है जो आपको cdवापस करना चाहिए जहां आप थे (बैश का उपयोग करके), क्योंकि ऐसा करने के लिए मत भूलना सवाल का उद्देश्य प्रतीत होता है:

# Save where you are and cd to other dir
pushd /path/to/dir/that/needs/to/be/current/dir

run-your-command

# Get back where you were at the beginning.
popd

(संपादित करें: थोड़ा कम संस्करण, @ Random832 के लिए धन्यवाद)


1
आप बस कर सकते हैं pushd other-dir, बल्किpushd .; cd other-dir
random832

@ Random832, अच्छी बात!
ब्रूनो

2

अफसोस की बात है, आपका उदाहरण:

execindirectory -d /var/log "cp *.log ~/Desktop"

dir में बदलाव की आवश्यकता नहीं है, क्योंकि

cp /var/log/*.log ~/Desktop

ऐसा ही होगा। क्या आप अपनी वास्तविक समस्या के करीब नहीं पहुँच सकते? क्योंकि हम इसके लिए एक बेहतर समाधान भी जान सकते हैं।

आपकी समस्या को हल करने का एक जटिल तरीका, जो माइकल्स समाधान की लालित्य से दूर है, खोज का उपयोग है, जिसमें एक स्विच '-execir' है जिसे dir में प्रदर्शन किया जाना है, जहां एक फ़ाइल मिलती है। बुरी तरह से अपने उदाहरण के लिए अपनाया:

find /var/log -maxdepth 1 -type f -name "*.log" -execdir echo cp {} ~/Desktop ";"

हो सकता है कि यह आपकी वास्तविक समस्या के लिए उपयोगी हो। -okdir के बजाय -execdir आपको हर आह्वान की पुष्टि करने के लिए कहेगा।

-okdir और -execdir को स्थापित करने के लिए gnu-find की आवश्यकता हो सकती है, जिसका उपयोग आमतौर पर लिनक्स पर किया जाता है।


1

कैसे के बारे में ./your/path/command.sh?


नहीं, मैं वास्तव में निम्नलिखित की तरह कुछ मतलब था execindirectory -d /var/log "cp *.log ~/Desktop":।
Naftuli Kay

मुझे पूरी तरह से पता है कि यह कड़ाई से आवश्यक नहीं है, वैसे, मुझे बस दिलचस्पी है अगर यह वास्तव में किया जा सकता है।
Naftuli Kay
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.