bash 스크립트를 작성할 때 현재 파일 위치의 절대 경로는 어떻게 얻습니까?


16

라는 bash 파일이 있다고 가정하십시오 myBash.bash. 다음에 상주합니다.

/myDirect/myFolder/myBash.bash

이제 스크립트 내에서 문자열 /myDirect/myFolder(의 위치 myBash.bash) 을 사용하고 싶습니다 . 이 위치를 찾는 데 사용할 수있는 명령이 있습니까?

편집 : 아이디어는 zip 파일 내부의 bash 스크립트로 시작할 수있는 코드로 zip 폴더를 설정하고 싶다는 것입니다. 해당 zip 파일 내부의 코드의 상대 파일 경로는 알고 있지만 절대 경로는 알고 있지 않으며 필요합니다. 한 가지 방법은 경로를 하드 코딩하거나 파일 경로를 변수로 지정하는 것입니다. 그러나 bash 파일이 자체 위치를 파악한 다음 zip 파일의 구조에 대한 지식을 통해 다른 파일에 대한 관련 경로를 만드는 것이 더 쉽다는 것을 알았습니다.


3
이는 스택 오버플로에 더 적합 할 수 있습니다. 다음 질문을 확인하십시오 : stackoverflow.com/questions/4774054/… stackoverflow.com/questions/59895/… .
Sethos II

1
어떻게 사용합니까? 명확히하십시오
Sergiy Kolodyazhnyy

1
@SethosII이 질문은 전체적으로 주제입니다
Zanna

1
질문에 더 많은 맥락을 추가했습니다. 실행중인 파일의 파일 경로를 얻는 쉬운 / 명백한 명령이있을 것이라고 생각했지만 대답은 적어도 분명하지 않은 것 같습니다.
dimpol

3
@ Zanna 나는 그것이 주제가 아니라고 말하지 않습니다. 더 적절하다고 생각하고 이미 링크 된 여러 링크가 표시된 것처럼 보입니다.
Sethos II

답변:


24

다음과 같은 전체 경로를 얻을 수 있습니다.

realpath "$0"

로 그리고 SERG 지적 당신이 사용할 수있는 dirname이 같은 파일 이름을 제거하는

dirname "$(realpath $0)"

어려운 파일 이름으로 어색한 인용 및 단어 분리를 방지하는 것이 좋습니다.

temp=$( realpath "$0"  ) && dirname "$temp"

그것을 파싱하려는 이전의 아이디어보다 훨씬 낫습니다 (더 나은 방법이있을 것임을 알고있었습니다!)

realpath "$0" | sed 's|\(.*\)/.*|\1|'

노트

  • realpath 파일의 실제 경로를 반환
  • $0 이 파일입니까 (스크립트)
  • s|old|new|교체 oldnew
  • \(.*\)//나중에 문자를 저장하십시오
  • \1 저장된 부분

2
의 사용 일 $0sed마법. 그러나 고 말했다 sed마법 때 도구처럼 정말 불필요한 dirname존재
세르지 Kolodyazhnyy

2
당신은 이미 대답을 가지고, 사용 realpath: realpath "$( dirname $0 )"나는 개인적으로 사용 readlink하지만 그게 나야 :readlink -e $(dirname $0)
Sergiy Kolodyazhnyy

@ Serg : dirname "$(realpath "$0")"더 나을까요 ? 일반적으로 해당 파일을 참조하는 기호 링크의 상위 디렉토리 대신 참조 된 파일의 상위 디렉토리를 알고 자합니다.
David Foerster

4
@Serg "$(dirname "$(realpath "$0")")"가 가장 간단한 방법입니다. 내부 $()작업을 정상적으로 인용합니다 .
DepressedDaniel

@DepressedDaniel 온라인에서 약간의 연구를 했으므로 옳습니다 $(). 나는 하나 실현하지 않는 한 그것은 간단처럼 말할하지 않을 $()모든 서브 쉘입니다
세르지 Kolodyazhnyy

5

스크립트가 경로에 있으면 다음과 같은 것을 사용할 수 있습니다

$ myloc=$(dirname "$(which foo.sh)")
$ echo "$myloc"
/path/to/foo.sh

편집 : Serg에서 주석을 읽은 후에는 스크립트가 경로에 있는지 여부에 관계없이 작동하는 일반적인 솔루션 일 수 있습니다.

myloc==$(dirname "$(realpath $0)")
dirname "$myloc"

which스크립트가 PATH변수의 일부인 디렉토리 중 하나에 상주 할 때 더 적합 합니다. $0Zanna 쇼와 같이 스크립트 내에서 사용하십시오 . 당신이 사용하기 때문에하지만 당신의 대답은 올바른 것입니다 dirname대신 덤비는의 sed따라서, 그 +1
세르지 Kolodyazhnyy

5

받아 들여진 대답은 완벽 해 보입니다. 다른 방법은 다음과 같습니다.

cd "$(dirname "$0")"
/bin/pwd

/bin/pwdpwd내장 명령 과 달리 디렉토리의 실제 경로를 인쇄합니다 .


0
wdir="$PWD"; [ "$PWD" = "/" ] && wdir=""
case "$0" in
  /*) scriptdir="${0}";;
  *) scriptdir="$wdir/${0#./}";;
esac
scriptdir="${scriptdir%/*}"
echo "$scriptdir"

kenorb and andro 에서 참조로 사용됩니다.
No dirname, readlink, realpath, BASH_SOURCE
모두 내장되어 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.