Mac OS X의 셸 스크립트에서 절대 파일 이름을 어떻게 검색합니까?


19

현재 실행중인 스크립트 파일의 절대 파일 이름을 검색하고 싶습니다. 링크도 해결해야합니다.

Linux에서는 다음과 같이 수행됩니다.

$(readlink -mn "$0")

하지만 readlink작동하는 것 같다 매우 맥 OS X에서 다르게

나는 이것이 사용된다는 것을 읽었다.

$(realpath $0)

BSD에서도 작동하지 않습니다. Mac OS X에는이 없습니다 realpath.

어떤 생각?


1
SO에 대한이 질문을 참조하십시오 : stackoverflow.com/questions/799679/…
Telemachus

3
그리고 이것은 하나입니다 : stackoverflow.com/questions/1055671/…
Telemachus

답변:


19

나는이 일을 위해 속임수를 사용합니다.

#!/bin/bash
dirname=`perl -e 'use Cwd "abs_path";print abs_path(shift)' $0`
echo $dirname

나는 단지 전체 스크립트를 펄로 작성한다고 생각할 것이다.


고마워요. 최대한 빨리 투표를하겠습니다. 누구든지 이것을하는 "순수한 껍질"방법이 있습니까?
Huxi

1
나는 이것이 얻는만큼 두려운 것 같습니다. (Google에서 찾을 수있는 여러 줄의 "순수 쉘"해킹을 제공합니다.)
Arjan

또 다른 가능성은 (추악하지만) '..'경로를 탐색하여 '..'이 방금 가진 것과 같은 파일을 반환 할 때까지 (재귀 또는 배열을 통해) 암기하는 것입니다 (예 : 맨 위에 있음). 당신이가는 길. 나는 '진정한'경로를 얻는 방법으로 strace 중에 Legato의 Networker 백업 소프트웨어가 이것을하는 것을 보았습니다 (아마 절대는 아님). 그러나 위의 코드보다 훨씬 많은 코드가 될 것입니다.
ericslaw

누군가가 $ 0 대신 $ 1을 사용하도록 코드를 수정 한 이유를 잘 모르겠습니다. bash 스크립트의 첫 번째 인수가 1 달러가 아닙니까? 첫 번째 인수가 아닌 실행중인 bash 스크립트의 경로를 원했습니다.
ericslaw

27
#!/usr/bin/env bash
scriptDir="$(cd "$(dirname "$0")" && pwd -P)"

MacOSX에서도 작동합니다.
Alexar

1
이 슈퍼입니다! 주위에 떠 다니는 다른 복잡한 질문이 많이 있습니다.
Jason S

3
이것은 일반적으로 심볼릭 링크 된 파일이 아닌 심볼릭 링크 된 디렉토리에있는 파일에 대해서만 작동합니다.
Gerhard Burger

1
unset -v CDPATHCDPATH를 설정하면 cd로 인해 원치 않는 출력이 발생할 수 있으므로 cd 이전에 도움 이됩니다.
Binary Phile

파일의 최소 단일 레이어의 심볼릭 링크를 처리하기 위해 readlink와 호환되는 방식으로 테스트 할 수도 있습니다 (mac에는 -f가 없음) : scriptDir=$(unset -v CDPATH; cd "$(dirname "$(readlink "$BASH_SOURCE" || echo "$BASH_SOURCE)")" && pwd -P)
Binary Phile

0

이것은 심볼릭 링크의 콤보를 처리하며 파일과 폴더에서 작동합니다.

#!/usr/bin/env bash
realpath()
{
    if ! pushd $1 &> /dev/null; then 
        pushd ${1##*/} &> /dev/null
        echo $( pwd -P )/${1%/*}
    else
        pwd -P
    fi
    popd > /dev/null
}

그러나 실제 경로의 상대는 지원하지 않습니다. 여기에 설명 된 변환이 필요합니다 .


0

다른 접근법 :

# Install.
brew install coreutils

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