Programing

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

lottogame 2020. 2. 14. 23:21
반응형

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


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)

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


cd "`dirname $(readlink -f ${0})`"

echo $PWD

PWD는 환경 변수입니다.


현재 작업 디렉토리를 인쇄 해야하는 경우이를 수행 할 수 있습니다.

$ vim test

#!/bin/bash
pwd
:wq to save the test file.

실행 권한을 부여하십시오.

chmod u+x test

그런 다음 스크립트를 실행하면 ./test현재 작업 디렉토리를 볼 수 있습니다.

참고 URL : https://stackoverflow.com/questions/3349105/how-to-set-current-working-directory-to-the-directory-of-the-script



반응형