वहाँ एक अलग निर्देशिका में एक कमांड निष्पादित करने के लिए एक रास्ता cd
है यह करने के लिए बिना ? मुझे पता है कि मैं बस cd
अंदर और cd
बाहर जा सकता था, लेकिन मैं अतिरिक्त कदमों को आगे बढ़ाने की संभावनाओं में दिलचस्पी रखता हूं :)
वहाँ एक अलग निर्देशिका में एक कमांड निष्पादित करने के लिए एक रास्ता cd
है यह करने के लिए बिना ? मुझे पता है कि मैं बस cd
अंदर और cd
बाहर जा सकता था, लेकिन मैं अतिरिक्त कदमों को आगे बढ़ाने की संभावनाओं में दिलचस्पी रखता हूं :)
जवाबों:
मुझे नहीं पता कि क्या यह मायने रखता है, लेकिन आप एक उपधारा बना सकते हैं:
$ (cd /var/log && cp -- *.log ~/Desktop)
निर्देशिका केवल उस उपधारा के लिए बदल जाती है, इसलिए आप cd -
बाद में आवश्यकता के काम से बचते हैं ।
$ (cd /var/log && cp *.log ~/Desktop)
:। इस तरह, यदि निर्देशिका मौजूद नहीं है, तो आगे कोई कमांड निष्पादित नहीं की जाती है।
कुछ कार्यक्रमों विकल्पों जिसके साथ आप उन्हें बता सकते हैं 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
अन्य लोगों द्वारा दिए गए उत्तरों के मूल्य को कम करने के लिए नहीं, लेकिन मेरा मानना है कि आप जो चाहते हैं वह यह है:
(cd /path/to && ./executable [ARGS])
cd
एक उप-शेल में आह्वान करने के लिए पार्नस पर ध्यान दें ।
यहाँ कुछ है जो आपको 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 के लिए धन्यवाद)
pushd other-dir
, बल्किpushd .; cd other-dir
अफसोस की बात है, आपका उदाहरण:
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 की आवश्यकता हो सकती है, जिसका उपयोग आमतौर पर लिनक्स पर किया जाता है।
कैसे के बारे में ./your/path/command.sh
?
execindirectory -d /var/log "cp *.log ~/Desktop"
:।
echo "#!/bin/bash; cd $1; exec $2" > /usr/local/bin/execindirectory; chmod +x /usr/local/bin/execindirectory
:। यदि आप वास्तव में "टैग" जैसे विकल्प-d
और सामान का समर्थन करना चाहते हैं, तो इसे थोड़ा और प्रयास करने की आवश्यकता हो सकती है ।