스크립트에서 $0
가능한 상대 경로를 얻습니다. 그것을 절대 값으로 변환하기 위해 이해하지 못하는 다음 솔루션을 찾았습니다.
abspath=$(cd ${0%/*} && echo $PWD/${0##*/})
${0%/*}
내 문제는 내부의 마법과 ${0##*/}
. 전자는 디렉토리 이름을 추출하고 후자는 파일 이름을 추출하는 것처럼 보이지만 어떻게되는지 모르겠습니다.
답변1
Sean은 가장 간단한 해결책을 가지고 있습니다 readlink -f $0
. 이상한 파일 이름을 처리하는 것에 대해 확실히 알고 싶다면 다음을 사용할 수 있습니다.
absolute_path_x="$(readlink -fn -- "$0"; echo x)"
absolute_path="${absolute_path_x%x}"
답변2
정의:
${string%substring}
$substring
의 끝에서 가장 짧은 일치 항목이 제거되었습니다 $string
.
${string##substring}
$substring
의 시작 부분에서 가장 긴 일치 항목이 제거되었습니다 $string
.
귀하의 예:
abspath=$(cd ${0%/*} && echo $PWD/${0##*/})
${0%/*}
마지막 슬래시 뒤의 모든 항목을 제거하여 스크립트의 디렉터리 이름(상대 경로일 수 있음)을 제공합니다.
${0##*/}
마지막 슬래시 앞의 모든 항목을 제거하고 스크립트 이름만 지정합니다.
따라서 이 명령은 스크립트의 디렉토리로 변경하고 $PWD
현재 작업 디렉토리(제공)와 스크립트 이름을 연결하여 절대 경로를 제공합니다.
무슨 일이 일어나고 있는지 확인하려면 다음을 시도해 보세요.
echo ${0%/*}
echo ${0##*/}
답변3
작업을 수행하는 더 안전하고 읽기 쉬운 방법은 다음과 같습니다.
abspath=$(unset CDPATH && cd "$(dirname "$0")" && echo $PWD/$(basename "$0"))
노트:
- 이전 경로가 없는 파일 이름만 있으면
$0
원래 스크립트는 실패하지만 여기에 제공된 스크립트는 작동합니다. (문제는 아니지만,$0
다른 앱에서는 발생할 수 있습니다.) - 파일 경로가 실제로 존재하지 않으면 두 방법 모두 실패합니다. ( 에서는 문제가 되지 않지만
$0
다른 응용 프로그램에서는 문제가 될 수 있습니다.) unset
사용자가 설정한 경우CDPATH
필수입니다 .readlink -f
또는 와 달리realpath
이는 Linux가 아닌 버전의 Unix(예: Mac OS X)에 적용됩니다.
답변4
bash 내장 명령 pwd를 소개합니다. GNU coreutils 패키지에도 있습니다.
$ sh ./cygdrive/c/cygwin/home/../../../../home/jaroslav/tmp/somewhere.sh
$0: ./cygdrive/c/cygwin/home/../../../../home/jaroslav/tmp/somewhere.sh
cheeky binary from /home/jaroslav/tmp (/home/jaroslav/tmp)
$ cat /home/jaroslav/tmp/somewhere.sh
abs=$( cd `dirname "$0"` ; pwd -P)
absBin=$( cd `dirname "$0"` ; /bin/pwd -P)
echo \$0: $0
echo cheeky binary from $abs \($absBin\)