我想$PWD
在脚本中使用该变量,但我希望它是没有符号链接的硬件路径。我知道/bin/pwd
和pwd -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%??}
}