스크립트에서 절대 경로 찾기


10

스크립트에서 나는 $0가능한 상대 경로를 얻는다 . 그것을 절대로 변환하기 위해 이해할 수없는이 솔루션을 찾았습니다.

abspath=$(cd ${0%/*} && echo $PWD/${0##*/})

내 문제는 내부의 마법 ${0%/*}${0##*/}. 전자가 dirname을 추출하고 후자가 파일 이름을 추출하는 것처럼 보입니다. 어떻게 얻지 못합니다.


2
그것은 매개 변수 확장을 사용하지만 나에게는 효과가 없었습니다. 스크립트를 Linux에서만 사용 readlink -f $0하려는 경우 표준 경로를 얻는 데 사용할 수 있습니다 .
Shawn J. Goff

1
@Shawn : "당신은 매개 변수 확장을 사용하지만 나에게는 효과가 없었습니다."라는 올바른 생각을 소개했기 때문에 1 개의 큰 의견 투표. 이 dirname유틸리티는 여기서 유용합니다.
D4RIO

mywiki.wooledge.org/BashFAQ/028cyberciti.biz/faq/...은 말한다 BASH_SOURCE더보다가 $0, 같은 $0사용자의 명령에 입력, 현재 실행중인 스크립트가 아닐 수 있습니다.
Joel Purra

답변:


8

정의 :

${string%substring}$substring끝에서 가장 짧은 일치 항목을 삭제합니다 $string.

${string##substring}$substring의 시작 부분에서 가장 긴 일치 항목을 삭제합니다 $string.

귀하의 예 :

abspath=$(cd ${0%/*} && echo $PWD/${0##*/})

${0%/*} 마지막 슬래시 뒤의 모든 항목을 삭제하여 스크립트의 디렉토리 이름 (상대 경로 일 수 있음)을 제공합니다.

${0##*/} 마지막 슬래시까지 모든 것을 삭제하여 스크립트 이름 만 제공합니다.

따라서이 명령은 스크립트의 디렉토리로 변경되고 현재 작업 디렉토리 (에서 제공 $PWD)와 스크립트의 이름을 연결하여 절대 경로를 제공합니다.

무슨 일이 일어나고 있는지 보려면 :

echo ${0%/*}
echo ${0##*/}

쉘 특수 문자를 포함하는 (거의 모든) 파일 이름에 대처하려면 모든 변수 확장에 큰 따옴표를 추가하십시오.
Gilles 'SO- 악마 그만해'

10

Shawn은 가장 간단한 해결책을 가지고있었습니다 readlink -f $0. 이상한 파일 이름을 처리하려면 다음을 사용하십시오.

absolute_path_x="$(readlink -fn -- "$0"; echo x)"
absolute_path="${absolute_path_x%x}"

선적 서류 비치


1
마지막 줄 바꿈이 올바르게 처리되었는지 확인하십시오. 불행히도 readlink -fnLinux, NetBSD 및 OpenBSD에만 해당됩니다.
Gilles 'SO- 악마 그만'

4

이 작업을 수행하는보다 안전하고 읽기 쉬운 방법은 다음과 같습니다.

abspath=$(unset CDPATH && cd "$(dirname "$0")" && echo $PWD/$(basename "$0"))

노트:

  • 경우 $0없는 이전 경로 베어 파일 이름입니다, 원래 스크립트가 실패하지만 여기에 주어진 하나가 작동합니다. (문제는 $0아니지만 다른 응용 프로그램에있을 수 있습니다.)
  • 파일 경로가 실제로 존재하지 않으면 두 가지 방법 중 하나가 실패합니다. (에는 문제가 $0없지만 다른 응용 프로그램에있을 수 있습니다.)
  • unset사용자가 수도있는 경우 반드시 CDPATH설정합니다.
  • 달리 readlink -f거나 realpath,이 (예를 들어, 맥 OS X) 유닉스가 아닌 리눅스 버전에서 작동합니다.

2

Shell Parameter Expansion을 배우려면 here 에서 읽을 수 있지만 Expansion이 항상 좋은 선택은 아닙니다. 이 경우 시스템과 같은 거의 모든 유닉스에는 두 가지 유용한 유틸리티가 있습니다.

basename
dirname

첫 번째는 파일 이름을 추출하고 두 번째는 경로를 추출하므로 $ 0이면 다음과 같이 말하십시오.

dirname $0

그리고 당신은 길을 얻을 것입니다.

건배


dirname은 상대 경로를 반환 할 수 있습니다
opticyclic

0

bash 내장 pwd를 소개합니다. GNU coreutils 패키지에도 있습니다.

$ sh ./cygdrive/c/cygwin/home/../../../../home/jaroslav/tmp/somewhere.sh
$0: ./cygdrive/c/cygwin/home/../../../../home/jaroslav/tmp/somewhere.sh
cheeky binary from /home/jaroslav/tmp (/home/jaroslav/tmp)

$ cat /home/jaroslav/tmp/somewhere.sh

abs=$( cd `dirname "$0"` ; pwd -P)
absBin=$( cd `dirname "$0"` ; /bin/pwd -P)
echo \$0: $0
echo cheeky binary from $abs \($absBin\)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.