ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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 커맨드를 입력했습니다. 

    foo/bar/tmp.sh

    tmp.sh를 homde directory에서 실행한 결과

    home 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. 스크립트가 상위 디렉토리 경로 저장하기

    foo/ directory

    #/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에서 경로 다루는 방법이었습니다. 좀 더 좋은 예제를 발견할 경우 차차 추가할 생각입니다:)

    혹시 이상한 부분이 있거나 이해가 안 되는 경우가 있다면 댓글 남겨 주시기 바랍니다!

     

    댓글

Designed by Tistory.