Dlaczego bieżący katalog nie zmienia się w pliku makefile?

14

Próbuję uruchomić prosty skrypt - sklonować repozytorium git do określonego katalogu, a następnie cddo tego katalogu, aby wykonać skrypt instalacyjny.

Ten skrypt znajduje się w pliku Makefile.

Ale cdwydaje się, że nie działa. Nie znajduje mojego skryptu instalacyjnego.

Dodałem pwd po cdskrypcie i pokazuje mi katalog, z którego wykonuję skrypt, a nie katalog, w którym się cdznajduję.

Jaki jest problem?

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

=>

pwd: /hereIsPathToDirectoryFromWhichIRunTheScript

python: nie można otworzyć pliku „setup.py”: [Errno 2] Brak takiego pliku lub katalogu

To też nie działa ./setup.py.

Jeśli wprowadzę ścieżkę bezwzględną, ~/some_dir/setup.pyskrypt nie powiedzie się później, ponieważ próbuje uzyskać dostęp do zasobów w tym samym folderze.

Ixx
źródło
Czy możesz spróbować czegoś takiego: „alias mycd = 'cd some_dir'; mycd”
alpert
To nie działa:/bin/sh: mycd: command not found
Ixx
Znalazłem rozwiązanie: stackoverflow.com/questions/1789594/... musiał dodać; po cd, a następnie uruchom skrypt w tym samym wierszu.
Ixx

Odpowiedzi:

36

Używasz makefile. Pliki makefile nie są skryptami, każda linia jest wykonywana w nowej powłoce. Oznacza to, że po zmianie środowiska w linii (np. cd) Zmiana ta nie jest propagowana do następnej linii.

Rozwiązaniem jest to, że jeśli chcesz zachować środowisko między poleceniami, wszystkie polecenia wykonujesz w tym samym wierszu. Wszystkie polecenia zostaną wówczas wykonane w tej samej powłoce, a środowisko zostanie zachowane.

Na przykład:

target:
    git clone http://somerepo ~/some_dir
    cd ~/some_dir/ && python myscript.py install
Patrick
źródło
Zobacz także ten post, aby uzyskać zaktualizowaną odpowiedź.
mloning
0

Skrypt jest uruchamiany w podpowłoce , co oznacza, że ​​ma swoją własną $PWD. Po wyjściu otrzymasz „stary” $PWD. Jeśli chcesz zachować $PWD, musisz source(aka. .) Skrypt zamiast go uruchamiać. Nie będzie to jednak działać w Makefile, ponieważ każde polecenie jest uruchamiane w osobnej podpowłoce:

$ pwd
/home/user
$ cat test.sh
cd /
$ cat Makefile
test:
    . ./test.sh && pwd
    pwd
$ make test
. ./test.sh && pwd
/
pwd
/home/user
l0b0
źródło
Znalazłem rozwiązanie: stackoverflow.com/questions/1789594/... musiał dodać; po cd, a następnie uruchom skrypt w tym samym wierszu.
Ixx