Чому поточний каталог не змінюється в makefile?


14

Я намагаюся запустити простий скрипт - клонуйте сховище git у певний каталог, потім cdу цей каталог, щоб виконати інсталяційний скрипт.

Цей сценарій знаходиться в Makefile.

Але, cdсхоже, не працює. Він не знаходить мого сценарію встановлення.

Я додав pwd після cdсценарію в, і він показує мені каталог, звідки я виконую скрипт, а не каталог, куди я cdпотрапляю.

В чому проблема?

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

=>

pwd: /hereIsPathToDirectoryFromWhichIRunTheScript

python: не вдається відкрити файл '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/… повинен був додати a; після компакт-диска, а потім виконайте скрипт у тому ж рядку.
Ixx

Відповіді:


36

Ви використовуєте makefile. Makefiles - це не сценарії, кожен рядок виконується в новій оболонці. Це означає, що коли ви змінюєте оточення в рядку (наприклад cd), ця зміна не поширюється на наступний рядок.

Рішення полягає в тому, що коли ви хочете зберегти середовище між командами, ви запускаєте всі команди в одному рядку. Усі команди потім будуть виконані в одній оболонці, а середовище збережене.

Наприклад:

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

Також дивіться цю публікацію для оновленої відповіді.
плавання

0

Сценарій запускається в нижній частині , що означає, що він має власну $PWD. Як тільки він виходить, ви отримуєте "старе" $PWD. Якщо ви хочете зберегти скрипт, $PWDвам потрібно source(ака. .) Замість запуску. Однак це не буде працювати в Makefile, тому що кожна команда виконується в окремій підпакеті:

$ 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/… повинен був додати a; після компакт-диска, а потім виконайте скрипт у тому ж рядку.
Ixx
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.