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


14

Estou tentando executar um script simples - clonar um repositório git em um determinado diretório e depois cdnesse diretório para executar um script de instalação.

Este script está em um Makefile.

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

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

Qual é o problema?

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

=>

pwd: /hereIsPathToDirectoryFromWhichIRunTheScript

python: não é possível abrir o arquivo 'setup.py': [Erro 2] Nenhum arquivo ou diretório existe

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

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


Você pode tentar algo como: "alias mycd = 'cd some_dir'; mycd"
alpert 18/08/14

Isso não funciona:/bin/sh: mycd: command not found
Ixx

Encontrei a solução: stackoverflow.com/questions/1789594/… tinha que adicionar um; após o cd e, em seguida, execute o script na mesma linha.
Ixx

Respostas:


36

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 na 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 os comandos, executa todos os comandos na mesma linha. Todos os comandos serão executados no mesmo shell e o ambiente é preservado.

Por exemplo:

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

Consulte também esta postagem para obter uma resposta atualizada.
mloning

0

Um script é executado em uma subshell , o que significa que ele possui o seu próprio $PWD. Depois que sai, você fica com o "velho" $PWD. Se você deseja manter o que $PWDvocê precisa source(aka. .), O 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

Encontrei a solução: stackoverflow.com/questions/1789594/… tinha que adicionar um; após o cd e, em seguida, execute o script na mesma linha.
Ixx
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.