$PWD 变量等价于 pwd -P

$PWD 变量等价于 pwd -P

我想$PWD在脚本中使用该变量,但我希望它是没有符号链接的硬件路径。我知道/bin/pwdpwd -P,但那些不是变量。

我知道我可以使用:

setenv MYPWD `pwd -P`

但我记得还有另一种方法可以做到这一点。

答案1

在 POSIX shell 中,之后

cd -P .

$PWD将包含无符号链接的路径。

在 中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%??}
}

相关内容