ทำไมไดเรกทอรีปัจจุบันไม่เปลี่ยนแปลงใน makefile


14

ฉันพยายามที่จะเรียกใช้cdสคริปต์ง่ายๆที่เก็บ git ลงในไดเรกทอรีหนึ่งแล้วไปที่ไดเรกทอรีนี้เพื่อดำเนินการสคริปต์การติดตั้ง

สคริปต์นี้อยู่ใน Makefile

แต่cdดูเหมือนว่าจะไม่ทำงาน ไม่พบสคริปต์การติดตั้งของฉัน

ฉันเพิ่ม pwd หลังจากcdในสคริปต์และมันแสดงให้ฉันเห็นไดเรกทอรีจากที่ฉันกำลังรันสคริปต์ไม่ใช่ไดเรกทอรีที่ฉัน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สคริปต์จะล้มเหลวในภายหลังเนื่องจากพยายามเข้าถึงทรัพยากรในโฟลเดอร์เดียวกัน


คุณลองได้ไหม: "alias mycd = 'cd some_dir'; mycd"
alpert

ที่ไม่ได้ทำงาน:/bin/sh: mycd: command not found
Ixx

ฉันพบวิธีแก้ปัญหา: stackoverflow.com/questions/1789594/…ต้องเพิ่ม; หลังจาก cd แล้วรันสคริปต์ในบรรทัดเดียวกัน
Ixx

คำตอบ:


36

คุณกำลังใช้ makefile Makefiles ไม่ใช่สคริปต์แต่ละบรรทัดจะถูกดำเนินการในเชลล์ใหม่ ความหมายเมื่อคุณเปลี่ยนสภาพแวดล้อมในบรรทัด (เช่นcd) การเปลี่ยนแปลงนั้นจะไม่แพร่กระจายไปยังบรรทัดถัดไป

ทางออกคือเมื่อคุณต้องการรักษาสภาพแวดล้อมระหว่างคำสั่งคุณเรียกใช้คำสั่งทั้งหมดในบรรทัดเดียวกัน คำสั่งทั้งหมดจะถูกดำเนินการในเชลล์เดียวกันและสภาพแวดล้อมจะถูกเก็บรักษาไว้

ตัวอย่างเช่น:

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

ดูโพสต์นี้สำหรับคำตอบที่ได้รับการปรับปรุง
mloning

0

สคริปต์จะดำเนินการในsubshell$PWDซึ่งหมายความว่ามันมีของตัวเอง เมื่อมันออกคุณจะได้รับ $PWD"เก่า" หากคุณต้องการเก็บไว้$PWDคุณต้องsource(aka. .) สคริปต์แทนการเรียกใช้มัน อย่างไรก็ตามสิ่งนี้จะไม่ทำงานใน Makefile อย่างไรก็ตามเนื่องจากคำสั่งแต่ละคำสั่งจะทำงานใน subshell แยก:

$ 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/…ต้องเพิ่ม; หลังจาก cd แล้วรันสคริปต์ในบรรทัดเดียวกัน
Ixx
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.