이 dirname
명령은 가장 기본적이며 단순히 $0
(스크립트 이름) 변수 에서 파일 이름까지의 경로를 구문 분석합니다 .
dirname "$0"
그러나 매트 b가 지적했듯이 반환되는 경로는 스크립트 호출 방법에 따라 다릅니다. pwd
스크립트가있는 디렉토리가 아니라 현재 디렉토리 만 알려주기 때문에 작업을 수행하지 않습니다. 또한 스크립트에 대한 심볼릭 링크가 실행되면 (아마도 상대적인) 경로를 얻게됩니다 실제 스크립트가 아닌 링크가있는 위치
다른 사람들은 readlink
명령 을 언급 했지만 가장 간단하게 다음을 사용할 수 있습니다.
dirname "$(readlink -f "$0")"
readlink
스크립트 경로를 파일 시스템의 루트에서 절대 경로로 해석합니다. 따라서 단일 또는 이중 도트, 물결표 및 / 또는 기호 링크가 포함 된 경로는 전체 경로로 해석됩니다.
다음은 이들 각각을 보여주는 스크립트입니다 whatdir.sh
.
#!/bin/bash
echo "pwd: `pwd`"
echo "\$0: $0"
echo "basename: `basename $0`"
echo "dirname: `dirname $0`"
echo "dirname/readlink: $(dirname $(readlink -f $0))"
상대 경로를 사용하여 내 홈 디렉토리 에서이 스크립트를 실행하십시오.
>>>$ ./whatdir.sh
pwd: /Users/phatblat
$0: ./whatdir.sh
basename: whatdir.sh
dirname: .
dirname/readlink: /Users/phatblat
다시 말하지만 스크립트의 전체 경로를 사용하십시오.
>>>$ /Users/phatblat/whatdir.sh
pwd: /Users/phatblat
$0: /Users/phatblat/whatdir.sh
basename: whatdir.sh
dirname: /Users/phatblat
dirname/readlink: /Users/phatblat
이제 디렉토리 변경 :
>>>$ cd /tmp
>>>$ ~/whatdir.sh
pwd: /tmp
$0: /Users/phatblat/whatdir.sh
basename: whatdir.sh
dirname: /Users/phatblat
dirname/readlink: /Users/phatblat
마지막으로 심볼릭 링크를 사용하여 스크립트를 실행하십시오.
>>>$ ln -s ~/whatdir.sh whatdirlink.sh
>>>$ ./whatdirlink.sh
pwd: /tmp
$0: ./whatdirlink.sh
basename: whatdirlink.sh
dirname: .
dirname/readlink: /Users/phatblat
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd && echo x)"
없이 제거하십시오DIR="${DIR%x}"
.