Ich versuche, ein einfaches Skript auszuführen. Klonen Sie ein Git-Repository in ein bestimmtes Verzeichnis und dann cd
in dieses Verzeichnis, um ein Installationsskript auszuführen.
Dieses Skript befindet sich in einem Makefile.
Aber das cd
scheint nicht zu funktionieren. Mein Installationsskript wird nicht gefunden.
Ich habe ein pwd nach dem cd
im 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.py
eingebe, schlägt das Skript später fehl, weil versucht wird, auf Ressourcen im selben Ordner zuzugreifen.
quelle
/bin/sh: mycd: command not found
Antworten:
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:
quelle
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,$PWD
müssen Sie das Skriptsource
(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:quelle