वर्तमान निर्देशिका मेकफाइल में क्यों नहीं बदलती?


14

मैं एक सरल स्क्रिप्ट को चलाने की कोशिश कर रहा हूं - एक निश्चित निर्देशिका में एक गिट रिपॉजिटरी को क्लोन करना, फिर cdएक इंस्टॉलेशन स्क्रिप्ट को निष्पादित करने के लिए इस निर्देशिका में।

यह स्क्रिप्ट मेकफाइल में है।

लेकिन cdलगता है काम नहीं हो रहा है। यह मेरी स्थापना स्क्रिप्ट नहीं ढूँढता है।

मैंने cdस्क्रिप्ट के बाद एक pwd जोड़ा , और यह मुझे निर्देशिका दिखा रहा है जहां से मैं स्क्रिप्ट निष्पादित कर रहा हूं, न कि वह निर्देशिका जहां मैं हूं cd

समस्या क्या है?

git clone http://somerepo ~/some_dir
cd ~/some_dir/
pwd
python myscript.py install

=>

pwd: /hereIsPathToDirectoryFromWhichIRunTheScript

अजगर: फ़ाइल 'setup.py' नहीं खोल सकता: [Errno 2] ऐसी कोई फ़ाइल या निर्देशिका नहीं

यह भी साथ काम नहीं करता है ./setup.py

अगर मैं निरपेक्ष पथ ~/some_dir/setup.pyमें प्रवेश करता हूं तो स्क्रिप्ट बाद में विफल हो जाती है क्योंकि यह उसी फ़ोल्डर में संसाधनों तक पहुंचने की कोशिश कर रहा है।


आप कुछ इस तरह की कोशिश कर सकते हैं: "उर्फ mycd = 'सीडी some_dir'; mycd"
alpert

यह काम नहीं करता है:/bin/sh: mycd: command not found
Ixx

मुझे समाधान मिल गया: stackoverflow.com/questions/1789594/… को जोड़ना पड़ा; सीडी के बाद और फिर उसी लाइन में स्क्रिप्ट निष्पादित करें।
Ixx

जवाबों:


36

आप एक मेकअप का उपयोग कर रहे हैं। Makefiles स्क्रिप्ट नहीं हैं, प्रत्येक पंक्ति को एक नए शेल में निष्पादित किया जाता है। मतलब जब आप वातावरण को लाइन में बदलते हैं (जैसे कि cd), तो वह परिवर्तन अगली पंक्ति में नहीं फैलता है।

समाधान यह है कि जब आप कमांड के बीच के वातावरण को संरक्षित करना चाहते हैं, तो आप सभी कमांड को एक ही पंक्ति में चलाते हैं। फिर सभी कमांड को एक ही शेल में निष्पादित किया जाएगा, और पर्यावरण संरक्षित है।

उदाहरण के लिए:

target:
    git clone http://somerepo ~/some_dir
    cd ~/some_dir/ && python myscript.py install

अपडेट किए गए उत्तर के लिए इस पोस्ट को भी देखें ।
mloning

0

एक स्क्रिप्ट को एक सबशेल में चलाया जाता है , जिसका अर्थ है कि उसका अपना है $PWD। एक बार जब यह बाहर निकलता है तो आपको "पुराना" मिलता है $PWD। आप रखना चाहते हैं $PWDआप की जरूरत है source(उर्फ। .इसे चलाने के बजाय) स्क्रिप्ट। हालाँकि, यह एक मेकफाइल में काम नहीं करेगा, क्योंकि प्रत्येक कमांड एक अलग उपधारा में चलती है:

$ pwd
/home/user
$ cat test.sh
cd /
$ cat Makefile
test:
    . ./test.sh && pwd
    pwd
$ make test
. ./test.sh && pwd
/
pwd
/home/user

मुझे समाधान मिल गया: stackoverflow.com/questions/1789594/… को जोड़ना पड़ा; सीडी के बाद और फिर उसी लाइन में स्क्रिप्ट निष्पादित करें।
Ixx
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.