스택큐힙리스트

Bash 스크립트 내부에서 해당 스크립트가 위치한 디렉토리를 어떻게 가져올 수 있나요? 본문

카테고리 없음

Bash 스크립트 내부에서 해당 스크립트가 위치한 디렉토리를 어떻게 가져올 수 있나요?

스택큐힙리스트 2023. 3. 19. 19:58
반응형

그 스크립트가 위치한 디렉토리의 경로를 그 스크립트 내에서 어떻게 얻을 수 있나요?

다른 어플리케이션을 시작하기 위해 Bash 스크립트를 사용하고 싶습니다. Bash 스크립트가 위치한 디렉토리로 작업 디렉토리를 변경하여 그 디렉토리의 파일을 조작할 수 있도록 하고 싶습니다.

$ ./application

답변 1

#!/usr/bin/env bash

SCRIPT_DIR=$( cd -- $( dirname -- ${BASH_SOURCE[0]} ) &> /dev/null && pwd )

이것은 스크립트가 호출되는 위치와 관계없이 전체 디렉토리 이름을 제공하는 유용한 한 줄 코드입니다.

스크립트를 찾을 때 사용된 경로의 마지막 구성 요소가 심볼릭 링크가 아니면 작동합니다(디렉토리 링크는 괜찮습니다). 스크립트 자체에 대한 링크도 해결하려면 멀티 라인 솔루션이 필요합니다.

#!/usr/bin/env bash

SOURCE=${BASH_SOURCE[0]}

while [ -L $SOURCE ]; do # resolve $SOURCE until the file is no longer a symlink

DIR=$( cd -P $( dirname $SOURCE ) >/dev/null 2>&1 && pwd )

SOURCE=$(readlink $SOURCE)

[[ $SOURCE != /* ]] && SOURCE=$DIR/$SOURCE # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located

done

DIR=$( cd -P $( dirname $SOURCE ) >/dev/null 2>&1 && pwd )

이 마지막은 별명, source , bash -c , 심링크 등의 모든 조합과 함께 작동합니다.

경고합니다. 이 코드 스니펫을 실행하기 전에 다른 디렉토리로 변경하면 결과가 올바르지 않을 수 있습니다!

또한, 만약 사용자가 출력을 stderr로 리디렉션하기 위해 cd를 스마트하게 무효화한 경우 (이스케이프 시퀀스를 포함한 경우, Mac에서 update_terminal_cwd >&2를 호출할 때와 같이), $CDPATH gotchas 및 stderr 출력의 부작용에 주의해야 합니다. $cd 명령의 끝에 >/dev/null 2>&1를 추가하면 두 가지 가능성을 처리할 수 있습니다.

작동 방식을 이해하기 위해 보다 자세한 형식으로 실행해 보세요.

#!/usr/bin/env bash

SOURCE=${BASH_SOURCE[0]}

while [ -L $SOURCE ]; do # resolve $SOURCE until the file is no longer a symlink

TARGET=$(readlink $SOURCE)

if [[ $TARGET == /* ]]; then

echo SOURCE '$SOURCE' is an absolute symlink to '$TARGET'

SOURCE=$TARGET

else

DIR=$( dirname $SOURCE )

echo SOURCE '$SOURCE' is a relative symlink to '$TARGET' (relative to '$DIR')

SOURCE=$DIR/$TARGET # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located

fi

done

echo SOURCE is '$SOURCE'

RDIR=$( dirname $SOURCE )

DIR=$( cd -P $( dirname $SOURCE ) >/dev/null 2>&1 && pwd )

if [ $DIR != $RDIR ]; then

echo DIR '$RDIR' resolves to '$DIR'

fi

echo DIR is '$DIR'

그러면 이렇게 출력됩니다:

SOURCE './scriptdir.sh' is a relative symlink to 'sym2/scriptdir.sh' (relative to '.')

SOURCE is './sym2/scriptdir.sh'

DIR './sym2' resolves to '/home/ubuntu/dotfiles/fo fo/real/real1/real2'

DIR is '/home/ubuntu/dotfiles/fo fo/real/real1/real2'

답변 2

바시(Bash) 스크립트가 저장된 디렉토리를 스크립트 자체에서 어떻게 얻을 수 있을까요?

바시 스크립트에서 현재 디렉토리를 확인해야 할 때가 있습니다. 스크립트의 위치는 실행 중인 시스템에서 어딘가에 있을 것입니다. 스크립트의 위치를 알면 스크립트에서 다른 파일들을 로드하거나 출력을 저장하는 디렉토리를 확실히 지정할 수 있습니다.

스크립트 내에서 스크립트가 위치한 디렉토리를 얻으려면, 스크립트에서 다음의 명령을 실행하면 됩니다.

```bash

#!/bin/bash

DIR=$( cd $( dirname ${BASH_SOURCE[0]} ) >/dev/null 2>&1 && pwd )

echo $DIR

```

위 코드에서 `$BASH_SOURCE[0]`는 현재 스크립트 파일의 경로를 의미합니다. `dirname` 명령은 경로에서 디렉토리 이름을 추출합니다. 따라서 `cd` 명령을 사용하여 현재 작업 디렉토리를 스크립트가 위치한 디렉토리로 변경할 수 있습니다. 마지막으로 `pwd` 명령을 사용하여 현재 디렉토리의 전체 경로를 얻습니다.

위의 스크립트에서 `DIR` 변수는 스크립트가 위치한 디렉토리의 경로를 저장합니다. 이제 `DIR` 변수를 사용하여 필요한 작업을 수행할 수 있습니다.

이제 바시 스크립트 내에서 스크립트가 위치한 디렉토리를 얻는 방법을 알았습니다. 이를 활용하여 스크립트에서 필요한 작업을 보다 효율적으로 수행할 수 있을 것입니다.

반응형
Comments