¿Por qué el directorio actual no cambia en el archivo MAKE?

14

Estoy tratando de ejecutar un script simple: clonar un repositorio git en un directorio determinado, luego cda este directorio para ejecutar un script de instalación.

Este script está en un Makefile.

Pero cdparece que no funciona. No encuentra mi script de instalación.

Agregué un pwd después de cden el script, y me muestra el directorio desde donde estoy ejecutando el script, no el directorio donde estoy cd.

¿Cuál es el problema?

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

=>

pwd: /hereIsPathToDirectoryFromWhichIRunTheScript

python: no se puede abrir el archivo 'setup.py': [Errno 2] No existe tal archivo o directorio

Tampoco funciona con ./setup.py.

Si ingreso la ruta absoluta, ~/some_dir/setup.pyel script falla más tarde porque está intentando acceder a los recursos en la misma carpeta.

Ixx
fuente
¿Puedes probar algo como: "alias mycd = 'cd some_dir'; mycd"
alpert
Eso no funciona:/bin/sh: mycd: command not found
Ixx
Encontré la solución: stackoverflow.com/questions/1789594/… tuvo que agregar a; después del cd y luego ejecute el script en la misma línea.
Ixx

Respuestas:

36

Estás usando un archivo MAKE. Los Makefiles no son scripts, cada línea se ejecuta en un nuevo shell. Es decir, cuando cambia el entorno en línea (como cd), ese cambio no se propaga a la siguiente línea.

La solución es que cuando desea preservar el entorno entre comandos, ejecuta todos los comandos en la misma línea. Todos los comandos se ejecutarán en el mismo shell y se preservará el entorno.

Por ejemplo:

target:
    git clone http://somerepo ~/some_dir
    cd ~/some_dir/ && python myscript.py install
Patricio
fuente
También vea esta publicación para obtener una respuesta actualizada.
mloning
0

Un script se ejecuta en una subshell , lo que significa que tiene el suyo $PWD. Una vez que sale, obtienes el "viejo" $PWD. Si desea conservar el $PWDque necesita source(también conocido como .) el script en lugar de ejecutarlo. Sin embargo, esto no funcionará en un Makefile, porque cada comando se ejecuta en una subshell separada:

$ pwd
/home/user
$ cat test.sh
cd /
$ cat Makefile
test:
    . ./test.sh && pwd
    pwd
$ make test
. ./test.sh && pwd
/
pwd
/home/user
l0b0
fuente
Encontré la solución: stackoverflow.com/questions/1789594/… tuvo que agregar a; después del cd y luego ejecute el script en la misma línea.
Ixx