스크립트에서 절대 경로 찾기

스크립트에서 절대 경로 찾기

스크립트에서 $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\)

관련 정보