내 컴퓨터에는 여러 개의 Git 저장소가 있습니다. 각각에는 cleancode.py라는 스크립트가 포함된 script/라는 하위 디렉터리가 있습니다.
bash(실제로는 git-bash)를 사용하여 cleancode.py를 실행할 때 현재 작업 디렉터리가 있는 저장소의 scripts/ 디렉터리에서 cleancode.py 인스턴스를 실행하고 싶습니다. 내 현재 해킹은 내 경로에 다음을 포함하는 것입니다.
export PATH="$PATH:./scripts:./../scripts:./../../scripts:./../../../scripts:"
이 효과는 나쁘지 않습니다. 내가 있는 하위 디렉터리의 깊이가 3단계보다 높으면 실패할 수도 있지만 실제로는 문제가 되지 않습니다. 진짜 문제는 cleancode.py를 처음 실행할 때 해당 실행의 상대 경로를 기억하고 나중에는 해당 상대 경로에서만 cleancode.py를 찾는 것 같다는 것입니다. 따라서 먼저 repo 디렉터리에서 실행하면 작동합니다. 그런 다음 일부 하위 디렉터리로 이동하여 다시 실행하면 다음과 같은 결과를 얻습니다.
bash: ./scripts/cleancode.py: No such file or directory
처음 실행한 위치를 기준으로 찾은 경로를 사용하기 때문입니다. 그렇다면 스크립트를 마지막으로 찾은 위치를 기억하지 못하도록 하려면 어떻게 해야 합니까? 아니면 상대 경로 대신 절대 경로를 기억하도록 할 수 있나요? 마지막으로, 내 경로에 4개의 상대 경로를 추가하는 데 의존하지 않고 전체 문제를 처리하는 보다 강력한 방법이 있습니까? 미리 감사드립니다.
편집: 방금 알아냈어요경로에서 bash 실행 파일 캐싱을 비활성화합니다.set +h는 내 해킹의 결함을 수정했습니다. 하지만 실제 질문은 여전히 남아 있습니다. 가장 가까운 상대 경로에서 명령 버전을 찾는 가장 안정적인 방법은 무엇입니까?
답변1
cleancode
쉘 스크립트 내에서 쉘 스크립트를 생성 PATH
하고 다음과 같은 작업을 수행 할 수 있습니다 .
#!/bin/bash
cwd=$PWD
while [ "x$cwd" != x/ ]; do
if [ -e $cwd/scripts/cleancode.py ]; then
# do stuff here
break
fi
cwd=`dirname $cwd`
done
루프가 이전에 중단되었기 때문에 /
디렉터리는 검사되지 않습니다.