다음의 간단한 단일 라이너를 사용해보십시오.
모든 UNIX / OSX / Linux
dir=$(cd -P -- "$(dirname -- "$0")" && pwd -P)
세게 때리다
dir=$(cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)
참고 : 명령 옵션의 끝을 나타 내기 위해 명령에 이중 대시 (-)가 사용되므로 대시 또는 기타 특수 문자가 포함 된 파일은 명령을 중단하지 않습니다.
참고 : Bash에서는를 ${BASH_SOURCE[0]}
선호하여 사용하십시오. $0
그렇지 않으면 경로를 소싱 할 때 경로가 중단 될 수 있습니다 ( source
/ .
).
Linux, Mac 및 기타 * BSD의 경우 :
cd "$(dirname "$(realpath "$0")")";
참고 : realpath
Ubuntu와 같이 가장 널리 사용되는 Linux 배포판에 기본적으로 설치해야하지만 일부 경우에는 누락 될 수 있으므로 설치해야합니다.
참고 : Bash를 사용 ${BASH_SOURCE[0]}
하는 경우을 선호하십시오 $0
. 그렇지 않으면 경로를 소싱 할 때 경로가 끊어 질 수 있습니다 ( source
/ .
).
그렇지 않으면 다음과 같은 것을 시도 할 수 있습니다 (첫 번째 기존 도구를 사용합니다).
cd "$(dirname "$(readlink -f "$0" || realpath "$0")")"
Linux 전용 :
cd "$(dirname "$(readlink -f "$0")")"
* BSD / Mac에서 GNU readlink 사용하기 :
cd "$(dirname "$(greadlink -f "$0")")"
참고 : coreutils
설치 해야합니다 (예 : 1. Homebrew 설치 , 2. brew install coreutils
).
bash에서
bash에서는 다음 과 같이 매개 변수 확장 을 사용하여이를 수행 할 수 있습니다 .
cd "${0%/*}"
그러나 스크립트가 동일한 디렉토리에서 실행되면 작동하지 않습니다.
또는 bash에서 다음 기능을 정의 할 수 있습니다.
realpath () {
[[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"
}
이 함수는 1 개의 인수를 갖습니다. 인수에 이미 절대 경로가 있으면 그대로 인쇄하고, 그렇지 않으면 $PWD
변수 + 파일 이름 인수 ( ./
접두사 없이 )를 인쇄 하십시오 .
또는 다음은 데비안 .bashrc
파일 에서 가져온 버전입니다 .
function realpath()
{
f=$@
if [ -d "$f" ]; then
base=""
dir="$f"
else
base="/$(basename "$f")"
dir=$(dirname "$f")
fi
dir=$(cd "$dir" && /bin/pwd)
echo "$dir$base"
}
관련 :
또한보십시오:
Mac에서 GNU의 readlink -f 동작을 얻으려면 어떻게해야합니까?