Почему текущий каталог не изменяется в 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сценарий завершится неудачей позже, потому что он пытается получить доступ к ресурсам в той же папке.

Ixx
источник
Можете ли вы попробовать что-то вроде: "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
l0b0
источник
Я нашел решение: stackoverflow.com/questions/1789594/… пришлось добавить; после компакт-диска, а затем выполните сценарий в той же строке.
Ixx