-
[bash] 파일, 디렉토리 경로(path) 다루기 dirname, basename프로그래밍 언어/Shell Script 2021. 5. 13. 14:11
Github의 여러가지 오픈 소스를 보면, 각 프로젝트별로 자신들이 사용하는 Path를 bash script를 통해 참 깔끔하게 정리합니다. 그렇게 잘 정리된 프로젝트는 개발자가 해당 오픈 소스 프로젝트를 사용하는 데 있어서 굉장한 편의성을 가져다 줍니다.
하지만 bash 문법에 익숙하지 않으면 어떤 식으로 동작하는 지, 어느 스크립트 혹은 파일를 사용하는 지가 헷갈릴 때가 있기 때문에, 그런 경우에 경로 설정을 해줄 때 사용하는 커맨드를 위주로 정리를 해보려합니다.
경로를 다루는 커맨드?
아래와 같은 3가지 커맨드를 간단한 예제를 통해 설명하겠습니다.
$0 dirname basename
간단한 예제를 살펴 봅시다. foo/bar/tmp.sh 를 생성하였습니다.
아래와 같이 tmp.sh에 $0, dirname, basename 커맨드를 입력했습니다.
tmp.sh를 homde directory에서 실행한 결과
위의 예제에서 사용된 커맨드를 보면,
$0: 실행되는 스크립트의 이름
dirname: 마지막 '/' 이전의 이름을 출력해줍니다.
basename: 경로의 디렉토리들을 제외한 마지막 이름을 출력 해줍니다.
* 공식 설명 및 Option은 dirname --help, basename --help를 통해 확인 할 수 있습니다.
** $0을 제외하고 $1, $2, $@, $#, $* 등 여러가지가 있으나 이 부분은 여기서 확인 할 수 있습니다.
생각보다 간단하죠? 그렇다면 이 커맨드를 응용하여 사용하는 예제를 확인해보겠습니다.
다음은 예시를 통해 활용하는 방법을 알아보려 합니다.
1. 스크립트가 존재하는 디렉토리를 경로로 저장하기
#/bin/bash #foo/bar/tmp.sh SCRIPT_DIR=$(dirname $0) echo $SCRIPT_DIR #./foo/bar
간단한 예제 입니다.
스크립트를 실행할 때 해당 스크립트가 실행되는 디렉토리를 경로로 저장할 수 있습니다.
2. 스크립트가 상위 디렉토리 경로 저장하기
#/bin/bash #foo/bar/tmp.sh ANOTHER_DIR=$(dirname $(dirname $SCRIPT_DIR))/baz echo $ANOTHER_DIR #./baz
tmp.sh에서 상위 디렉토리의 다른 디렉토리로 경로를 저장할 때 사용합니다.
3. 스크립트를 다른 디렉토리에서 사용하도록 하기
#/bin/bash #foo/bar/tmp.sh [ -e $(basename $0) ] && echo "Use script in different directory" && exit 1 echo "Do something great!"
$(basename $0) 의 실행 결과
echo "$(basename $0)" #tmp.sh
만약 위의 스크립트를 foo/bar 디렉토리에서 실행하게 된다면 tmp.sh가 디렉토리내에 존재하므로 exit를 합니다.
하지만 tmp.sh가 존재하지 않는 다른 디렉토리에서 실행하게 될 시 "Do something great"를 출력합니다.
그러므로 해당 스크립트가 존재하지 않는 다른 디렉토리에서만 실행하도록 할 수 있습니다.
반대로
!를 추가하여 해당 스크립트가 동일한 디렉토리에서만 사용되게 할 수도 있습니다.
#/bin/bash #foo/bar/tmp.sh [ ! -e $(basename $0) ] && echo "Use script in same directory" && exit 1 echo "Do something great!"
위와 같이 사용하는 방법 외에도 pwd를 사용하여 절대경로를 얻는 방법 등도 있습니다만, 그 내용의 경우 다음에 다루도록 하겠습니다.
이상 bash에서 경로 다루는 방법이었습니다. 좀 더 좋은 예제를 발견할 경우 차차 추가할 생각입니다:)
혹시 이상한 부분이 있거나 이해가 안 되는 경우가 있다면 댓글 남겨 주시기 바랍니다!
'프로그래밍 언어 > Shell Script' 카테고리의 다른 글
[bash] 명령행 인자 $0, $@, $#, $* (command line argument) (0) 2021.05.14