일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Yes
- 데이터과학
- 빅데이터
- 프로그래밍언어
- 자바스크립트
- 소프트웨어공학
- 데이터베이스
- 네트워크보안
- 알고리즘
- 코딩
- 사이버보안
- 인공지능
- 네트워크
- I'm Sorry
- 버전관리
- 프로그래밍
- 소프트웨어
- 자료구조
- 데이터분석
- 머신러닝
- 데이터구조
- 2
- 보안
- 컴퓨터공학
- 딥러닝
- 컴퓨터과학
- 클라우드컴퓨팅
- 파이썬
- 컴퓨터비전
- 웹개발
- Today
- Total
스택큐힙리스트
Bash 스크립트 내부에서 해당 스크립트가 위치한 디렉토리를 어떻게 가져올 수 있나요? 본문
그 스크립트가 위치한 디렉토리의 경로를 그 스크립트 내에서 어떻게 얻을 수 있나요?
다른 어플리케이션을 시작하기 위해 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` 변수를 사용하여 필요한 작업을 수행할 수 있습니다.
이제 바시 스크립트 내에서 스크립트가 위치한 디렉토리를 얻는 방법을 알았습니다. 이를 활용하여 스크립트에서 필요한 작업을 보다 효율적으로 수행할 수 있을 것입니다.