Tại sao thư mục hiện tại không thay đổi trong makefile?


14

Tôi đang cố chạy một tập lệnh đơn giản - sao chép một kho lưu trữ git vào một thư mục nhất định, sau đó cdđến thư mục này để thực thi một tập lệnh cài đặt.

Kịch bản này là trong một Makefile.

Nhưng cddường như không được làm việc. Nó không tìm thấy tập lệnh cài đặt của tôi.

Tôi đã thêm một pwd sau cdtập lệnh và nó hiển thị cho tôi thư mục nơi tôi đang thực thi tập lệnh chứ không phải thư mục nơi tôi cdvào.

Có vấn đề gì vậy?

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

=>

pwd: /hereIsPathToDirectoryFromWhichIRunTheScript

python: không thể mở tệp 'setup.py': [Errno 2] Không có tệp hoặc thư mục như vậy

Nó cũng không hoạt động với ./setup.py.

Nếu tôi nhập đường dẫn tuyệt đối ~/some_dir/setup.pythì tập lệnh sẽ thất bại sau đó vì nó đang cố truy cập tài nguyên trong cùng một thư mục.


Bạn có thể thử một cái gì đó như: "bí danh mycd = 'cd some_dir'; mycd"
Alpert

Điều đó không hiệu quả:/bin/sh: mycd: command not found
Ixx

Tôi tìm thấy giải pháp: stackoverflow.com/questions/1789594/ đã phải thêm một; sau cd và sau đó thực thi tập lệnh trong cùng một dòng.
Ixx

Câu trả lời:


36

Bạn đang sử dụng tệp tạo tệp. Makefiles không có script, mỗi dòng được thực thi trong shell mới. Có nghĩa là khi bạn thay đổi môi trường trong dòng (chẳng hạn như cd), thay đổi đó không được truyền đến dòng tiếp theo.

Giải pháp là khi bạn muốn bảo vệ môi trường giữa các lệnh, bạn chạy tất cả các lệnh trong cùng một dòng. Tất cả các lệnh sau đó sẽ được thực thi trong cùng một shell và môi trường được giữ nguyên.

Ví dụ:

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

Cũng xem bài đăng này cho một câu trả lời cập nhật.
mlizing

0

Một tập lệnh được chạy trong một lớp con , có nghĩa là nó có tập lệnh riêng $PWD. Một khi nó thoát bạn sẽ có được "cũ" $PWD. Nếu bạn muốn giữ tập lệnh $PWDbạn cần source(aka. .) Kịch bản thay vì chạy nó. Tuy nhiên, điều này sẽ không hoạt động trong Makefile, vì mỗi lệnh được chạy trong một lớp con riêng biệt:

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

Tôi tìm thấy giải pháp: stackoverflow.com/questions/1789594/ đã phải thêm một; sau cd và sau đó thực thi tập lệnh trong cùng một dòng.
Ixx
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.