¿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.


¿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

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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.