किसी अन्य निर्देशिका से स्क्रिप्ट चलाना


11

अक्सर, जिस स्क्रिप्ट को मैं निष्पादित करना चाहता हूं, वह मेरी वर्तमान कार्यशील निर्देशिका में स्थित नहीं है और मैं वास्तव में इसे छोड़ना नहीं चाहता।

क्या अन्य निर्देशिका से स्क्रिप्ट (BASH, पर्ल आदि) चलाना एक अच्छा अभ्यास है? क्या वे आमतौर पर वे सभी सामान पाएंगे जो उन्हें ठीक से चलाने की आवश्यकता है?

यदि ऐसा है, तो "दूर" स्क्रिप्ट चलाने का सबसे अच्छा तरीका क्या है? क्या यह

. /path/to/script

या

sh /path/to/script

और sudoऐसे मामलों में उपयोग कैसे करें ? यह, उदाहरण के लिए, काम नहीं करता है:

sudo . /path/to/script

स्क्रिप्ट के . /path/to/script स्रोतों से अवगत रहें ! यदि आप इसे चलाना चाहते हैं तो आपको इस अवधि की बिल्कुल भी आवश्यकता नहीं है।
गनीउरफ_ग्निउरफ

जवाबों:


14

sh / path / to / script एक नया शेल स्पॉन करेगा और वह आपके वर्तमान शेल से स्वतंत्र स्क्रिप्ट चलाएगा। source(।) आदेश वर्तमान खोल में स्क्रिप्ट में सभी आदेशों को कॉल करेंगे। यदि स्क्रिप्ट exitउदाहरण के लिए कॉल करने के लिए होती है, तो आप वर्तमान शेल खो देंगे। इस वजह से यह आमतौर पर स्क्रिप्ट को अलग शेल में श के साथ कॉल करना या उन्हें पूर्ण (शुरुआत /) या रिश्तेदार पथ (/।) के साथ बायनेरी के रूप में निष्पादित करना है। यदि बायनेरिज़ के रूप में कहा जाता है, तो उन्हें निर्दिष्ट दुभाषिया (#! / Bin / bash, उदाहरण के लिए) के साथ निष्पादित किया जाएगा।

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

$(cd /wherever/ ; sh script.sh)

3
क्या आपका मतलब है (cd /wherever/ ; sh script.sh)? आपके $सामने क्यों है ?
जी-मैन का कहना है कि 'मोनिका'

7

आप निश्चित रूप से ऐसा कर सकते हैं (समायोजन के साथ अन्य का उल्लेख किया है जैसे ) sudo sh /pathto/script.shया ./script.sh। हालाँकि, मैं कुछ चीजों में से एक करता हूं ताकि उन्हें dirs के बारे में चिंता न हो और मुझे बेकार की टाइपिंग से बचाने के लिए सिस्टम को चौड़ा किया जा सके।

1) करने के लिए सिमिंक /usr/bin

ln -s /home/username/Scripts/name.sh /usr/bin/name

(सुनिश्चित करें कि वहाँ कोई अतिव्यापी नाम नहीं है, क्योंकि आप स्पष्ट रूप से इसे ओवरराइड करेंगे।) इससे मुझे अपने विकास फ़ोल्डर में भी रखने की सुविधा मिलती है, इसलिए मैं आवश्यकतानुसार समायोजित कर सकता हूं।

2) लिपियों को अपने पथ में जोड़ें (उपयोग .bash_profile - या जो कुछ भी आपके पास आपके शेल पर है)

PATH=/path/to/scripts/:$PATH

3) उर्फ के दशक में बनाएं .bash_profile में ~/.bash_profileतरह ऐड कुछ:

alias l="ls -l"

जैसा कि आप बता सकते हैं, वाक्यविन्यास सिर्फ उर्फ ​​है, अंक आप एक कमांड, कमांड के रूप में कार्य करना चाहते हैं। इसलिए टर्मिनल में कहीं भी "l" टाइप करने पर परिणाम होगा ls -l यदि आप sudo चाहते हैं, तो बस alias sl="sudo ls -l"अपने आप को l बनाम sl (एक बेकार के रूप में) पर ध्यान दें।

किसी भी तरह से, आप बस टाइप कर सकते हैं sudo nameofscriptऔर अपने रास्ते पर हो सकते हैं। के साथ गड़बड़ करने की कोई जरूरत नहीं है। / या। या श, आदि बस उन्हें पहले निष्पादन योग्य के रूप में चिह्नित करें: डी


मैं अत्यधिक विकल्प की सिफारिश करूंगा 2.
बर्नहार्ड 11

क्यों?, यह एक सर्वोत्तम अभ्यास है या सिर्फ स्वाद है?
सर्जियो

3

मैं आमतौर पर आप जैसा कहते हैं वैसा ही करते हैं

sh /path/to/script

और इसे रूट / सुपरयुसर के रूप में चलाने के लिए

sudo sh /path/to/script

आपकी वर्तमान निर्देशिका तभी मायने रखती है जब स्क्रिप्ट मानती है कि आप उसी फ़ोल्डर में हैं। मुझे लगता है कि अधिकांश स्क्रिप्ट ऐसा नहीं करते हैं और आप इसे ऊपर की तरह चलाने के लिए सहेज रहे हैं।


सुरक्षित_पैथ / etc / sudoers फ़ाइल में सेट होने पर काम नहीं करेगा
l1zard

3

मैं आमतौर पर अपनी स्क्रिप्ट्स को ( /usr/local/binया /usr/local/sbin/यदि स्क्रिप्ट को रूट विशेषाधिकारों की आवश्यकता होती है) रखता हूं , तो फाइलसिस्टम पदानुक्रम मानक (FHS) के अनुसार, वे संबंधित हैं।

आपको बस इतना करना है कि इन दो निर्देशिकाओं को आपके साथ जोड़ा जाए PATH। आप अपनी $HOME/.bashrcफ़ाइल को संपादित करके और इस पंक्ति को जोड़कर ऐसा कर सकते हैं :

export PATH=$PATH:/usr/local/sbin:/usr/local/bin

यदि आप किसी स्क्रिप्ट को रूट के माध्यम से निष्पादित करना चाहते हैं sudo, तो आपको इन निर्देशिकाओं को अपने चर secure_pathमें जोड़ना होगा /etc/sudoers

Defaults    secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

इस फ़ाइल को संपादित करके ऐसा किया जाता है visudoजो सुनिश्चित करता है कि आपकी कोई गलती नहीं है।


टाइपो: आप के .bashrcबजाय मतलब है .bachrc
गनीउरफ_ग्निउरफ

0

मुझे यकीन नहीं है कि यह लिनक्स में इस तरह से काम करता है, यह मानते हुए कि अगर कोई भी इसका सुझाव नहीं देता है। लेकिन वापस निर्देशिकाओं का उपयोग करने के लिए ././ के बजाय। क्या आप इसे एक पूर्ण मार्ग देने के लिए उद्धरणों का उपयोग कर सकते हैं? हो सकता है कि यह आपको पूरी ड्राइव तक पहुंच ही नहीं दे पा रहा हो।


0

यदि आपके पास ऐसी स्क्रिप्ट हैं जो आपको अक्सर चलाने की आवश्यकता होती हैं, और वे संसाधनों को खोजने के लिए उनके स्थान पर निर्भर करते हैं तो आप आसानी से इस तरह से एक उपनाम में आदेशों को जोड़कर ऐसा कर सकते हैं।

alias run-script="cd /home/user/path/to/script/ && bash script.sh"

इस तरह से आपको इसे काम करने के लिए किसी और चीज को बदलने की आवश्यकता नहीं है।


0

यह निश्चित नहीं है कि किसी ने इसे क्यों नहीं सुझाया है, लेकिन यह सुपर आसान है! मैंने कुछ बार गुगली की है और यह सटीक उत्तर मुझे नहीं मिल रहा है, इसलिए मैं सोच रहा हूं कि मैं साझा करूंगा। IMO, यह लेकिन सबसे अच्छा समाधान, सबसे आसान भी, मेरे लिए वैसे भी, हालांकि अन्य लोग महसूस कर सकते हैं और चीजों को अलग तरह से कर सकते हैं।

# Place this somewhere in your .bashrc/.bash_profile/etc and edit as you see fit

YOURCOMMAND () {
  cd /path/to/directory/containing/your/script/ && ./YOURSCRIPT
}

पहले 'cd' कमांड इसे स्क्रिप्ट लोकेशन की डायरेक्टरी बताती है। फिर '&&' ताकि आप अगली कमांड को एक्सेप्ट करने के बाद उसे टाई कर सकें। अंत में अपनी स्क्रिप्ट खोलें जैसे ही आप इसे टर्मिनल के भीतर निष्पादित करेंगे! अपनी BASH फ़ाइल में अपनी बचत की और सेटअप करने में 5 सेकंड का समय लिया।

आशा है कि यह किसी की मदद की।


-1

प्राचीन प्रश्न, लेकिन एक कालातीत।

जो समाधान मैंने लगातार देखा है वह एक $HOME/binनिर्देशिका है और इसे पहले डालें $PATH( ~/.bashrcयदि यह पहले से ही नहीं है, तो कुछ सिस्टम ~/binपहले $PATHडिफ़ॉल्ट रूप से हैं)। स्क्रिप्ट / एक्ज़िबेबल्स के निष्पादन या सहानुभूति के लिए वहाँ स्क्रिप्ट्स को ड्रोप करना, पथ के मुद्दों से निपटने का सरल तरीका है जो सिस्टम या अन्य उपयोगकर्ताओं को प्रभावित नहीं करना चाहिए।

यदि किसी स्क्रिप्ट में अतिरिक्त संसाधनों की आवश्यकता होती है जो अपने स्वयं के स्थान के सापेक्ष पाए जा सकते हैं (असामान्य नहीं) तो एनवार $BASH_SOURCEका उपयोग किया जाता है। $BASH_SOURCEहमेशा वर्तमान में चल रहे स्क्रिप्ट के लिए पूर्ण पथ समाहित करता है, भले ही इसका मान हो $PWD

निम्नलिखित को धयान मे रखते हुए:

ceverett@burrito:~$ echo $PATH
/home/ceverett/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

इसलिए हम देख सकते हैं कि $HOME/binमैं पहले स्थान पर $PATHहूं, इसलिए मैं जो भी डालूंगा ~/binवह चलेगा। मेरे पास एक प्रदर्शन स्क्रिप्ट है जिसे कहा जाता है ~/bin/findme:

#!/bin/bash

echo "Running from $BASH_SOURCE"

इसका उपयोग रनिंग स्क्रिप्ट के स्थान पर पूर्ण पथ प्राप्त करने के लिए किया जा सकता है।

ceverett@burrito:~$ findme
Running from /home/ceverett/bin/findme
ceverett@burrito:~$ cd foo
ceverett@burrito:~/foo$ findme
Running from /home/ceverett/bin/findme
ceverett@burrito:~/foo$ cd /
ceverett@burrito:/$ findme
Running from /home/ceverett/bin/findme

(1) इस आइटम दिखाई उपयोगी जानकारी होने के लिए करते हैं, सवाल नहीं पूछा कैसे लिखने लिपियों कि उपयोग के संसाधनों को अपने स्थान के सापेक्ष; इसने स्क्रिप्ट चलाने के बारे में पूछा। (२) मुझे यकीन नहीं है कि आपका दूसरा पैराग्राफ प्रश्न को कैसे संबोधित करता है। क्या आप यह सुझाव दे रहे हैं कि, यदि मैं एक स्क्रिप्ट लिखता हूं और डेसमंड इसे चलाना चाहता है, तो उसे इसे अपनी निजी binनिर्देशिका में जोड़ना चाहिए ? जो बोझिल लगता है। (३) इसके अलावा, यह स्थान की स्वतंत्रता को तोड़ता है। यदि /home/desmond/bin/fooमेरी स्क्रिप्ट का लिंक है, तो BASH_SOURCEहोगा /home/desmond/bin/foo, और स्क्रिप्ट अपने संसाधनों को खोजने में सक्षम नहीं होगी।
जी-मैन का कहना है कि 'मोनिका'

@ G-Man (1) उपयोगकर्ता ने अधिक संदर्भ प्रदान नहीं किया। जब भी यह प्रश्न मुझसे पिछले 30 वर्षों में पूछा गया है, तो यह हमेशा एक उपयोगकर्ता (आमतौर पर एक नया sysop या डेवलपर) के पास होता है जो तुच्छ कार्यों को स्वचालित करने के लिए अपनी और अन्य अधिग्रहीत लिपियों का मिश्रण चलाता है, इसलिए मैंने इसका उत्तर दिया मार्ग। यह उपयोगकर्ता द्वारा पूछे जाने वाले भाग पर स्क्रिप्टिंग ज्ञान का एक सा मान लेता है। (2) सिस्टम-वाइड स्क्रिप्ट आमतौर पर /binया एक ज्ञात स्थान में स्थापित की जाती हैं /opt। (३) स्थान की स्वतंत्रता वैसी ही है, जब यह निजी लिपियों के अंतर-निर्भर संग्रह को लिखते समय संरक्षित करता है।
zxq9
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.