'프로그래밍/Shell script'에 해당되는 글 1건

  1. 2013.05.23 bash에서 스크립트가 실제로 있는 디렉토리 찾기
  2. .

이럴 때 필요하다.

디렉토리 A에 top.sh, a.sh, b.sh 등이 있고 top.sh에서 a.sh, b.sh 등을 상대경로를 이용해서 실행한다고 하자. 디렉토리 B에서 ../../path-to-A/top.sh를 하면 경로가 꼬여서 a.sh, b.sh를 제대로 못 찾게 된다. 그렇게 때문에 top.sh 내부에서 caller의 위치와 무관하게 top.sh가 속한 디렉토리 경로를 구해야할 필요가 생긴다.


http://stackoverflow.com/questions/59895/can-a-bash-script-tell-what-directory-its-stored-in


DIR="$( unset CDPATH && cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"


* $0를 사용하면 bash script에서 source 명령어로 다른 bash script를 가져올 때 원래의 bash script 경로를 얻게된다. 그래서 ${BASH_SOURCE[0]}를 사용하는 것이 좋다.

* dirname을 이용하여 basename을 제외한 경로를 얻는다.

* cd한 후 pwd를 해서 절대 경로를 얻는다.


bash script 자체가 link로 연결되어 있고, 진짜 원본의 디렉토리를 알고 싶은 경우 링크된 stackoverflow 사이트에 직접가서 코드를 읽어보자.


그리고 bash script 내에서 cd 등을 사용한 경우 원하는 대로 동작하지 않는다. 그러나 bash script의 가장 앞에 이 코드를 두면 간단하게 해결되는 문제이다.


CDPATH 관련 문제도 있다고 한다. CDPATH는 cd 명령을 사용할 때 사용하는 PATH이다. Subshell을 띄우고 unset CDPATH를 하면 된다. (위 코드에서 $(와 ) 사이에서 unset한 것은 밖에 영향을 안 준다.)

그런데 다음과 같이 cd 경로를 명시적으로 적어주는 방법이 더 간단한 것 같다.

cd ./"$( dirname "${BASH_SOURCE[0]}" # THIS IS WRONG WAY

이렇게 하면 안 된다는 것을 발견했다. 그냥 unset CDPATH를 하는 것이 정확한 방법이다.

Posted by asdfzxcv