ABOUT ME

-

  • [linux] 스크립트 위치
    카테고리 없음

     

    TL; DR;

    #!/bin/bash
    SCRIPT_PATH="$( cd -- "$( dirname -- "${BASH_SOURCE[0]:-$0}"; )" &> /dev/null && pwd 2> /dev/null; )";

    문제

    환경 / 버전:

    Ubuntu / 18 LTS
    bin/bash
    bin/sh

    에러 코드 / 문제 : 

    얼마전 스크립트를 작성하면서 현재파일의 경로를 제대로 구하지 못하는 문제를 만나게 되었다. 이전까지는 아래와 같은 스크립트를 사용하여, 경로를 구해왔는데,

    SCRIPT_PATH=$(dirname $(realpath -s $0))
    이 방법은 realpath 명령어를 사용하여 파일의 경로를 구하는 방법으로
    1. pwd -P 와 동일한 기능을 하는 realpath 명령어
    2. 파일 경로를 담은 위치변수 $0의 값
    3. 심볼릭 링크 정보를 절대경로 위치로 바꿔주는 realpath -s 옵션
    4. 디렉토리 위치를 구하는 dirname 명령어
    등을 사용하여 만들었고 이전까지는 실행된 스크립트 스스로의 경로만 구했기 때문에 문제가 없었다.
    하지만 스타트업 스크립트가 다른 스크립트(A,B,C )들을 시작하는 경우, A 스크립트에서 파일경로로 스타트업 스크립트의 경로가 반환되었기 때문에, 항상 자기 자신의 파일경로를 구할 수 있는 방법이 필요했다.

    해결

    1. 한 스크립트에서 다른 스크립트를 실행하거나, sources를 통해, 다른 스크립트를 읽는 경우 위치 파라미터 $0의 값은 현재파일의 실행경로와 다를 수 있다.
    2. BASH에서는 파일 실행 전, 실행 스택을 BASH_SOURCE라는 환경변수(배열임)에 저장하므로 이를 이용하면 되었다.
    3. 현재 실행중인 파일에서는 BASH_SOURCE[0]을 통해 현재 위치를 구할 수 있다
    4. 어떤 셸(sh)에서는 BASH_SOURCE값이 없다. (당연히.. ㅋㅋ)
    그러므로 다음과 같은 스크립트를 만들 수 있다.
    1. ${BASH_SOURCE[0]:-$0} BASH_SOURCE 쓰거나, -$0 값을 사용해서 현재 위치를 구하기

     

    2. cd -- "$( dirname -- "${BASH_SOURCE[0]:-$0}"; )" &> /dev/null 구한 위치로 이동

    3. $( cd -- "$( dirname -- "${BASH_SOURCE[0]:-$0}"; )" &> /dev/null && pwd 2> /dev/null; ); 결과 출력

     

    참조

    https://www.baeldung.com/linux/bash-get-location-within-script

    https://mug896.github.io/bash-shell/shell_variables.html 

    https://stackoverflow.com/questions/35006457/choosing-between-0-and-bash-source 

    : 은 값을 무시하는 기능만 있는 것으로 알고 있었는데, :-으로 붙어서 else then 기능도 있다는 것을 새로 알게 되었다. 개꿀 ㅋㅋㅋ

    https://stackoverflow.com/questions/27445455/what-does-the-colon-dash-mean-in-bash

     

    댓글