현재 작업 디렉토리를 스크립트의 디렉토리로 설정하는 방법은 무엇입니까?
bash 스크립트를 작성 중입니다. 현재 작업 디렉토리가 항상 스크립트가있는 디렉토리가되어야합니다.
기본 동작은 스크립트의 현재 작업 디렉토리가 디렉토리를 실행하는 쉘의 디렉토리이지만이 동작을 원하지 않습니다.
#!/bin/bash
cd "$(dirname "$0")"
다음도 작동합니다.
cd "${0%/*}"
구문은 이 StackOverflow 답변 에 자세히 설명되어 있습니다.
다음의 간단한 단일 라이너를 사용해보십시오.
모든 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 동작을 얻으려면 어떻게해야합니까?
cd "$(dirname "${BASH_SOURCE[0]}")"
그것은 간단합니다. 효과가있다.
허용 된 답변은 into와 같이 다른 곳에서 심볼릭 링크되지 않은 스크립트에 적합합니다 $PATH
.
#!/bin/bash
cd "$(dirname "$0")"
그러나 스크립트가 심볼릭 링크를 통해 실행되면
ln -sv ~/project/script.sh ~/bin/;
~/bin/script.sh
이것은 ~/bin/
디렉토리가 아닌 디렉토리 로 들어갑니다. ~/project/
목적이 cd
상대를 포함 하는 것이 목적이라면 스크립트가 깨질 것입니다~/project/
symlink 안전 답변은 다음과 같습니다.
#!/bin/bash
cd "$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")"
readlink -f
잠재적으로 링크 된 파일의 절대 경로를 해결하려면 필수입니다.
따옴표는 잠재적으로 공백을 포함 할 수있는 파일 경로를 지원하는 데 필요합니다 (나쁜 방법이지만 이것이 사실이 아니라고 가정하는 것은 안전하지 않습니다).
이 스크립트는 저에게 효과적입니다.
#!/bin/bash
mypath=`realpath $0`
cd `dirname $mypath`
pwd
pwd 명령 줄은 스크립트의 위치를 스크립트를 어디에서 실행하든 현재 작업 디렉토리로 표시합니다.
스크립트의 실제 경로를 얻으십시오
if [ -L $0 ] ; then
ME=$(readlink $0)
else
ME=$0
fi
DIR=$(dirname $ME)
(이것은 내 질문에 대한 대답입니다 : 스크립트가 실행되는 디렉토리의 이름을 얻으십시오 )
cd "`dirname $(readlink -f ${0})`"
echo $PWD
PWD는 환경 변수입니다.
현재 작업 디렉토리를 인쇄 해야하는 경우이를 수행 할 수 있습니다.
$ vim test
#!/bin/bash
pwd
:wq to save the test file.
실행 권한을 부여하십시오.
chmod u+x test
그런 다음 스크립트를 실행하면 ./test
현재 작업 디렉토리를 볼 수 있습니다.
'Programing' 카테고리의 다른 글
"?"후에 GET 매개 변수에 액세스하는 방법 (0) | 2020.02.14 |
---|---|
텍스트 필드를 탐색하는 방법 (다음 / 완료 단추) (0) | 2020.02.14 |
선언적 프로그래밍과 명령형 프로그래밍의 차이점은 무엇입니까? (0) | 2020.02.14 |
명부 (0) | 2020.02.14 |
힘내 계속 내 ssh 키 암호 문구를 요구 (0) | 2020.02.14 |