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

  • Как написать точно скрипты bash в Make-файлы?
  • Почему используются «make clean» и «make mrproper»?
  • Как установить LuaJIT на FreeBSD без использования Gmake?
  • checkinstall зависает при «Копирование файлов во временный каталог ...» при создании vim8
  • Ошибочно думать, что правило преуспело из-за 0-размерного файла, сгенерированного перенаправлением вывода
  • Невозможно скомпилировать Apache: «Ошибка, библиотеки SSL / TLS отсутствовали или были недоступны»
  • Ошибка компиляции fmem с помощью make
  • Чтобы написать этот псевдокод с регулярным выражением
  • 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 
    Linux и Unix - лучшая ОС в мире.