$PWD 변수는 pwd -P와 동일합니다.

$PWD 변수는 pwd -P와 동일합니다.

해당 변수를 스크립트에서 사용 하고 싶지만 $PWD심볼릭 링크가 없는 하드웨어 경로가 되기를 원합니다. 나는 알고 /bin/pwd있지만 pwd -P그것은 변수가 아닙니다.

다음을 사용할 수 있다는 것을 알고 있습니다.

setenv MYPWD `pwd -P`

하지만 다른 방법이 있다는 것을 기억합니다.

답변1

POSIX 셸에서 다음

cd -P .

$PWD기호화되지 않은 링크를 포함하는 경로입니다.

in은 심볼릭 링크되지 않은 버전으로 확장됩니다 zsh( 단지 변수뿐만 아니라 모든 변수에 적용됨 ).$PWD:A$PWD$PWD

zsh, setopt chase_links및 에서는 심볼릭 링크 tcsh가 없는지 확인 set symlinks = chase해야 합니다 . 그러나 이는 첫 번째 이후에만 작동합니다 . 에서는 심볼릭 링크를 무료로 만들지 만 필요한 곳에서는 그렇지 않습니다 (작동이 보장되지 않음).cd$PWDcdzshcd .$PWDtcshcd "$cwd"

답변2

내가 아는 한, 환경에서는 해당 값이 링크된 버전이 아니라 실제 경로임을 보장하기 위해 그러한 변수를 제공하지 않습니다.

따라서 선택 사항은 이미 언급한 항목과 아래 대안으로 제한됩니다.

링크 읽기

다음을 사용하여 readlink심볼릭 링크가 가리키는 실제 디렉터리/파일을 가져올 수 있습니다.

견본:

$ ln -s /usr/bin/ack ack

$ ls -l |grep ack
lrwxrwxrwx   1 saml saml        12 Aug 15 11:48 ack -> /usr/bin/ack

물리적 위치:

$ readlink ./ack
/usr/bin/ack
$ readlink /home/saml/ack 
/usr/bin/ack
$ readlink $HOME/ack
/usr/bin/ack

전달한 값이 readlink링크가 아닌 경우 아무것도 반환하지 않습니다. 스위치를 사용하여 표준 값을 반환하도록 강제할 수 있습니다 -f.

$ echo $PWD
/home/saml

$ readlink -f $PWD
/home/saml

인용하다

답변3

를 사용하면 ksh93해당 변수를 구현하는 쉬운 방법이 있습니다 . 스크립트 시작 부분에 이 규율 함수를 추가하거나 스크립트로 가져옵니다.

function PWDP.get
{
  .sh.value=$(pwd -P)
}

그런 다음 예상대로 PWDP 변수를 사용할 수 있습니다.

$ mkdir /tmp/foo
$ ln -s /tmp/foo /tmp/bar
$ cd /tmp/bar
$ echo $PWD
/tmp/bar
$ echo $PWDP
/tmp/foo

편집하다, "약간" 더 복잡한 솔루션은 Stéphane Chazelas의 요점을 다루려고 시도합니다.

function PWDP.get
{
    typeset p=$(pwd -P; echo .)
    .sh.value=${p%??}
}

관련 정보