在我编写脚本之前,任何人都知道执行以下操作的简单方法:
$ pwd
/foo/bar
$ ls -l
lrwxr-xr-x 1 username admin 48 Apr 17 2012 foo.sh -> /bar/foo.sh
$ cd /bar
$ ls
foo.sh
IE,在目录中/foo/bar
,我想做类似cdl
(cd link) 的操作,这会将我带到链接文件的目录(或者链接目录,如果碰巧是这种情况,如果是的话我可以输入cd -P /bar
)。
答案1
在zsh中,有一个修饰语为此,或者更确切地说有两个:A
解决符号链接(与真实路径)并h
提取“头部”(即dirname
)。
cd $file(:A:h)
只有当符号没有被破坏时这才有效。如果存在符号链接链,则遵循它直到最终目标。如果通过符号链接到达该目录,您将位于其目标中(与 一样cd -P
)。
没有 zsh,如果您有该readlink
实用程序,并且您想要更改到包含符号链接目标的目录:
cd -- "$(dirname -- "$(readlink -- "$file")")"
链接的目标本身可以是符号链接。如果你想切换到包含链接最终目标的目录,可以readlink
循环调用:
while [ -L "$file" ]; do
target=$(readlink -- "$file")
while case $target in */) target=${target%/};; *) false;; esac; done
case $target in
*/*) cd -- "${target%/*}"; target=${target#**/};;
esac
done
在 Linux 上,假设符号链接没有损坏,您可以使用readlink -f
规范化路径:
t=$(readlink -f -- "$file")
cd "${t%/*}"
答案2
您可以使用readlink
解析符号链接,然后dirname
获取其目录。
cdl () {
cd "$(dirname "$(readlink "$1")")";
}
bash-3.2$ pwd
/foo/bar
bash-3.2$ ls -l
total 8
lrwxr-xr-x 1 root wheel 11 Jun 15 19:10 foo.sh -> /bar/foo.sh
bash-3.2$ cdl foo.sh
bash-3.2$ pwd
/bar
bash-3.2$
答案3
一条线:
cd $(dirname $([ -L $0 ] && readlink -f $0 || echo $0))