Warum ändert sich das aktuelle Verzeichnis im Makefile nicht?

13

Ich versuche, ein einfaches Skript auszuführen. Klonen Sie ein Git-Repository in ein bestimmtes Verzeichnis und dann cdin dieses Verzeichnis, um ein Installationsskript auszuführen.

Dieses Skript befindet sich in einem Makefile.

Aber das cdscheint nicht zu funktionieren. Mein Installationsskript wird nicht gefunden.

Ich habe ein pwd nach dem cdim Skript hinzugefügt und es zeigt mir das Verzeichnis, von dem aus ich das Skript ausführe, nicht das Verzeichnis, in das ich gehe cd.

Was ist das Problem?

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

=>

pwd:: /hereIsPathToDirectoryFromWhichIRunTheScript

Python: Datei 'setup.py' kann nicht geöffnet werden: [Errno 2] Keine solche Datei oder kein solches Verzeichnis

Es funktioniert auch nicht mit ./setup.py.

Wenn ich den absoluten Pfad ~/some_dir/setup.pyeingebe, schlägt das Skript später fehl, weil versucht wird, auf Ressourcen im selben Ordner zuzugreifen.

Ixx
quelle
Können Sie etwas versuchen wie: "alias mycd = 'cd some_dir'; mycd"
alpert
Das funktioniert nicht:/bin/sh: mycd: command not found
Ixx
Ich habe die Lösung gefunden: stackoverflow.com/questions/1789594/… musste ein hinzufügen; nach der CD und führen Sie dann das Skript in der gleichen Zeile aus.
Ixx

Antworten:

36

Sie verwenden ein Makefile. Makefiles sind keine Skripte, jede Zeile wird in einer neuen Shell ausgeführt. Das heißt, wenn Sie die Umgebung in einer Zeile ändern (z. B. cd), wird diese Änderung nicht in die nächste Zeile übertragen.

Die Lösung besteht darin, dass Sie alle Befehle in derselben Zeile ausführen, wenn Sie die Umgebung zwischen Befehlen beibehalten möchten. Alle Befehle werden dann in derselben Shell ausgeführt, und die Umgebung bleibt erhalten.

Zum Beispiel:

target:
    git clone http://somerepo ~/some_dir
    cd ~/some_dir/ && python myscript.py install
Patrick
quelle
In diesem Beitrag finden Sie auch eine aktualisierte Antwort.
Moning
0

Ein Skript wird in einer Subshell ausgeführt , dh es hat eine eigene $PWD. Sobald es beendet ist, erhalten Sie das "alte" $PWD. Wenn Sie das behalten möchten, $PWDmüssen Sie das Skript source(auch bekannt als .) ausführen, anstatt es auszuführen. Dies funktioniert jedoch in einem Makefile nicht, da jeder Befehl in einer separaten Subshell ausgeführt wird:

$ pwd
/home/user
$ cat test.sh
cd /
$ cat Makefile
test:
    . ./test.sh && pwd
    pwd
$ make test
. ./test.sh && pwd
/
pwd
/home/user
l0b0
quelle
Ich habe die Lösung gefunden: stackoverflow.com/questions/1789594/… musste ein hinzufügen; nach der CD und führen Sie dann das Skript in der gleichen Zeile aus.
Ixx