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

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

간단한 스크립트를 실행하려고 합니다. git 저장소를 디렉터리에 복제한 다음 cd해당 디렉터리에 복제하여 설치 스크립트를 실행합니다.

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

하지만 cd작동하지 않는 것 같습니다. 내 설치 스크립트를 찾을 수 없습니다.

나중에 스크립트에 비밀번호를 추가했는데 cd여기에는 내가 입력한 디렉토리가 아니라 스크립트를 실행한 디렉토리가 표시됩니다 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동일한 폴더에 있는 리소스에 액세스하려고 하기 때문에 나중에 스크립트가 실패합니다.

답변1

makefile을 사용하고 있습니다. Makefile은 스크립트가 아니며 각 줄은 새 셸에서 실행됩니다. 이는 행에서 환경을 변경하면(예: cd) 변경 사항이 다음 행에 전파되지 않음을 의미합니다.

해결책은 명령 간의 컨텍스트를 유지하려는 경우 동일한 줄에서 모든 명령을 실행하는 것입니다. 모든 명령은 동일한 셸에서 실행되며 환경은 보존됩니다.

예를 들어:

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

답변2

GNU 버전 3.82부터 Makefile의 맨 위에 make추가할 수 있으며 예상대로 작동합니다. .ONESHELL:cd folder문서 읽기

답변3

스크립트는 다음에서 실행됩니다.서브쉘즉, $PWD종료하면 "오래된" 상태가 됩니다 $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

관련 정보