makefile에서 현재 디렉토리가 변경되지 않는 이유는 무엇입니까?


14

cd설치 스크립트를 실행하기 위해 git 저장소를 특정 디렉토리에 복제 한 다음 이 디렉토리 로 간단한 스크립트를 실행하려고합니다 .

이 스크립트는 Makefile에 있습니다.

그러나 cd작동하지 않는 것 같습니다. 설치 스크립트를 찾지 못했습니다.

cd스크립트 뒤에 pwd를 추가 하면 스크립트가 실행되는 디렉토리가 아닌 내가 스크립트를 실행하는 디렉토리가 표시 cd됩니다.

뭐가 문제 야?

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

=>

pwd: /hereIsPathToDirectoryFromWhichIRunTheScript

python : 'setup.py'파일을 열 수 없습니다 : [Errno 2] 해당 파일 또는 디렉토리가 없습니다.

또한 작동하지 않습니다 ./setup.py.

절대 경로를 입력 ~/some_dir/setup.py하면 동일한 폴더의 리소스에 액세스하려고하기 때문에 나중에 스크립트가 실패합니다.


"alias mycd = 'cd some_dir'; mycd"
alpert

작동하지 않습니다 :/bin/sh: mycd: command not found
Ixx

나는 해결책을 발견 : stackoverflow.com/questions/1789594/...는 a를했다; cd 다음에 같은 줄에서 스크립트를 실행하십시오.
Ixx

답변:


36

당신은 makefile을 사용하고 있습니다. Makefile은 스크립트가 아니며, 각 줄은 새로운 쉘에서 실행됩니다. 라인에서 환경을 변경할 때 (예 cd:), 해당 변경 사항은 다음 라인으로 전파되지 않습니다.

해결책은 명령 사이의 환경을 유지하려는 경우 모든 명령을 동일한 행에서 실행하는 것입니다. 그런 다음 모든 명령이 동일한 셸에서 실행되고 환경이 유지됩니다.

예를 들면 다음과 같습니다.

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

또한 업데이트 된 답변 은이 게시물 을 참조하십시오 .
mloning

0

스크립트는 서브 쉘 에서 실행 되는데 이는 자체 스크립트를 가지고 있음을 의미합니다 $PWD. 종료되면 "old"가 $PWD됩니다. 유지하려는 경우, $PWD당신은 필요 source(일명. .) 스크립트를 대신를 실행하는. 그러나 각 명령 이 별도의 하위 셸에서 실행 되기 때문에 Makefile에서는 작동하지 않습니다 .

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

나는 해결책을 발견 : stackoverflow.com/questions/1789594/...는 a를했다; cd 다음에 같은 줄에서 스크립트를 실행하십시오.
Ixx
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.