Perché la directory corrente non cambia in makefile?


14

Sto cercando di eseguire un semplice script, clonare un repository git in una determinata directory, quindi cdin questa directory per eseguire uno script di installazione.

Questo script è in un Makefile.

Ma cdsembra non funzionare. Non trova il mio script di installazione.

Ho aggiunto un pwd dopo il cdnello script e mi mostra la directory da cui sto eseguendo lo script, non la directory in cui mi trovo cd.

Qual è il problema?

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

=>

pwd: /hereIsPathToDirectoryFromWhichIRunTheScript

python: impossibile aprire il file 'setup.py': [Errno 2] Nessun file o directory

Inoltre non funziona con ./setup.py.

Se ~/some_dir/setup.pyentro nel percorso assoluto lo script non riesce più tardi perché sta tentando di accedere alle risorse nella stessa cartella.


Puoi provare qualcosa del tipo: "alias mycd = 'cd some_dir'; mycd"
alpert

Non funziona:/bin/sh: mycd: command not found
Ixx,

Ho trovato la soluzione: stackoverflow.com/questions/1789594/… ha dovuto aggiungere un; dopo il cd e quindi eseguire lo script nella stessa riga.
Ixx,

Risposte:


36

Stai usando un makefile. I makefile non sono script, ogni riga viene eseguita in una nuova shell. Significato quando si modifica l'ambiente in linea (come cd), tale modifica non viene propagata alla riga successiva.

La soluzione è che quando si desidera preservare l'ambiente tra i comandi, si eseguono tutti i comandi nella stessa riga. Tutti i comandi verranno quindi eseguiti nella stessa shell e l'ambiente verrà preservato.

Per esempio:

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

Vedi anche questo post per una risposta aggiornata.
mloning il

0

Uno script viene eseguito in una subshell , il che significa che ha il suo $PWD. Una volta uscito ottieni il "vecchio" $PWD. Se si desidera mantenere ciò che $PWDè necessario source(aka. .) Lo script invece di eseguirlo. Questo non funzionerà in un Makefile, tuttavia, poiché ogni comando viene eseguito in una subshell separata:

$ pwd
/home/user
$ cat test.sh
cd /
$ cat Makefile
test:
    . ./test.sh && pwd
    pwd
$ make test
. ./test.sh && pwd
/
pwd
/home/user

Ho trovato la soluzione: stackoverflow.com/questions/1789594/… ha dovuto aggiungere un; dopo il cd e quindi eseguire lo script nella stessa riga.
Ixx,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.