Pourquoi le répertoire actuel ne change pas dans le makefile?

14

J'essaie d'exécuter un simple script - clonez un référentiel git dans un certain répertoire, puis cddans ce répertoire afin d'exécuter un script d'installation.

Ce script est dans un Makefile.

Mais le cdsemble ne pas fonctionner. Il ne trouve pas mon script d'installation.

J'ai ajouté un pwd après le cddans le script, et il me montre le répertoire à partir duquel j'exécute le script, pas le répertoire dans lequel cdj'entre.

Quel est le problème?

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

=>

pwd: /hereIsPathToDirectoryFromWhichIRunTheScript

python: impossible d'ouvrir le fichier 'setup.py': [Errno 2] Aucun fichier ou répertoire de ce type

Cela ne fonctionne pas non plus ./setup.py.

Si j'entre le chemin absolu, ~/some_dir/setup.pyle script échoue plus tard, car il essaie d'accéder aux ressources dans le même dossier.

Ixx
la source
Pouvez-vous essayer quelque chose comme: "alias mycd = 'cd some_dir'; mycd"
alpert
Cela ne fonctionne pas:/bin/sh: mycd: command not found
Ixx
J'ai trouvé la solution: stackoverflow.com/questions/1789594/… a dû ajouter un; après le cd, puis exécutez le script sur la même ligne.
Ixx

Réponses:

36

Vous utilisez un makefile. Les Makefiles ne sont pas des scripts, chaque ligne est exécutée dans un nouveau shell. Cela signifie que lorsque vous modifiez l'environnement en ligne (comme cd), ce changement n'est pas propagé à la ligne suivante.

La solution est que lorsque vous souhaitez préserver l'environnement entre les commandes, vous exécutez toutes les commandes sur la même ligne. Toutes les commandes seront alors exécutées dans le même shell, et l'environnement sera préservé.

Par exemple:

target:
    git clone http://somerepo ~/some_dir
    cd ~/some_dir/ && python myscript.py install
Patrick
la source
Voir également ce post pour une réponse mise à jour.
mloning le
0

Un script est exécuté dans un sous - shell , ce qui signifie qu'il a le sien $PWD. Une fois qu'il sort, vous obtenez le "vieux" $PWD. Si vous souhaitez conserver le dont $PWDvous avez besoin source(aka. .) Le script au lieu de l'exécuter. Cela ne fonctionnera pas dans un Makefile, cependant, car chaque commande est exécutée dans un sous-shell distinct:

$ pwd
/home/user
$ cat test.sh
cd /
$ cat Makefile
test:
    . ./test.sh && pwd
    pwd
$ make test
. ./test.sh && pwd
/
pwd
/home/user
l0b0
la source
J'ai trouvé la solution: stackoverflow.com/questions/1789594/… a dû ajouter un; après le cd, puis exécutez le script sur la même ligne.
Ixx