[bash] 현재 작업 디렉토리를 스크립트의 디렉토리로 설정하는 방법은 무엇입니까?

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")")";

참고 : realpathUbuntu와 같이 가장 널리 사용되는 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)

(이것은 내 질문에 대한 대답입니다 : 스크립트가 실행되는 디렉토리의 이름을 얻으십시오 )