-
TL; DR;
#!/bin/bash
SCRIPT_PATH="$( cd -- "$( dirname -- "${BASH_SOURCE[0]:-$0}"; )" &> /dev/null && pwd 2> /dev/null; )";문제
환경 / 버전:
Ubuntu / 18 LTSbin/bashbin/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