해당 변수를 스크립트에서 사용 하고 싶지만 $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
$PWD
cd
zsh
cd .
$PWD
tcsh
cd "$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%??}
}