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

Я пытаюсь запустить простой скрипт-клонировать 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 абсолютный путь ~/some_dir/setup.py сценарий завершится неудачно позже, потому что он пытается получить доступ к ресурсам в той же папке.

2 Solutions collect form web for “Почему текущий каталог не изменяется в make-файле?”

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

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

Например:

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

Скрипт запускается в подоболочке , что означает, что он имеет свой собственный $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 
  • Ошибка компиляции Ocaml в AIX 6.1
  • Stow - нет скрипта configure
  • Как изменить путь установки моего исходного дерева Linux?
  • Каковы различия в редактировании UTS_RELEASE и EXTRAVERSION?
  • У GNUmakefile, GNUmakefile.am и GNUmakefile.in указано, что Automake был использован?
  • Файлы с файлами Makefile с шаблоном
  • Как добавить текст в переменную в make-файле?
  • Как узнать, какие файлы использует Makefile?
  • Разница между sudo make и sudo -s; делать
  • Что делает «make install» в Makefile, который поставляется с ядром?
  • Исправить: /usr/lib/libnssutil3.so: неопределенная ссылка на `PL_ClearArenaPool '
  • В чем причина того, что файл конфигурации требуется для удаления приложения, установленного через configure, make и make install?
  • Linux и Unix - лучшая ОС в мире.