Por que o diretório atual não é alterado no makefile?

7

Estou tentando executar um script simples - clonar um repositório git em um determinado diretório e, em seguida, cd neste diretório para executar um script de instalação.

Este script está em um Makefile.

Mas o cd parece não estar funcionando. Não encontra o meu script de instalação.

Eu adicionei um pwd após o cd no script e ele mostra o diretório de onde estou executando o script, não o diretório em que eu cd .

Qual é o problema?

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

= >

pwd : /hereIsPathToDirectoryFromWhichIRunTheScript

python: can't open file 'setup.py': [Errno 2] No such file or directory

Também não funciona com ./setup.py .

Se eu digitar o caminho absoluto ~/some_dir/setup.py , o script falhará mais tarde porque está tentando acessar recursos na mesma pasta.

    
por Ixx 18.08.2014 / 15:44

2 respostas

22

Você está usando um makefile. Makefiles não são scripts, cada linha é executada em um novo shell. Ou seja, quando você altera o ambiente em linha (como cd ), essa alteração não é propagada para a próxima linha.

A solução é que quando você deseja preservar o ambiente entre comandos, você executa todos os comandos na mesma linha. Todos os comandos serão executados no mesmo shell e o ambiente será preservado.

Por exemplo:

target:
    git clone http://somerepo ~/some_dir
    cd ~/some_dir/ && python myscript.py install
    
por 18.08.2014 / 16:31
0

Um script é executado em uma subshell , o que significa que ele tem seu próprio $PWD . Depois que você sair, receberá o "antigo" $PWD . Se você quiser manter o $PWD , você precisa do source (aka. . ) do script em vez de executá-lo. Isso não funcionará em um Makefile, no entanto, porque cada comando é executado em um subshell separado:

$ pwd
/home/user
$ cat test.sh
cd /
$ cat Makefile
test:
    . ./test.sh && pwd
    pwd
$ make test
. ./test.sh && pwd
/
pwd
/home/user
    
por 18.08.2014 / 15:52