간단한 스크립트를 실행하려고 합니다. 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