Почему текущий каталог не изменяется в make-файле?


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/… пришлось добавить; после компакт-диска, а затем выполните сценарий в той же строке.
Ixx

Ответы:


36

Вы используете make-файл. Makefiles не являются скриптами, каждая строка выполняется в новой оболочке. Это означает, что при изменении среды в строке (например, cd) это изменение не распространяется на следующую строку.

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

Например:

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

Также см. Этот пост для обновленного ответа.
mloning

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