Cha*_*ett 7 shell zsh cd-command symlink
在我编写脚本之前,任何人都知道执行以下操作的简单方法:
$ 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
Run Code Online (Sandbox Code Playgroud)
即,在目录中/foo/bar
,我想做一些类似cdl
(cd link) 的操作,这会将我带到链接文件的目录(或者也可以转到链接目录,如果碰巧是这样的话——如果是我的话)可以输入cd -P /bar
)。
在 zsh 中,有一个修饰符,或者更确切地说是两个:A
解析符号链接(使用realpath)和h
提取“头部”(即dirname
)。
cd $file(:A:h)
Run Code Online (Sandbox Code Playgroud)
这仅在符号未损坏时才有效。如果存在符号链接链,则一直跟踪到最终目标。如果该目录是通过符号链接访问的,您将进入其目标(与 一样cd -P
)。
如果没有 zsh,如果您有该readlink
实用程序,并且想要更改到包含符号链接目标的目录:
cd -- "$(dirname -- "$(readlink -- "$file")")"
Run Code Online (Sandbox Code Playgroud)
链接的目标本身可能是一个符号链接。如果要切换到包含链接最终目标的目录,可以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
Run Code Online (Sandbox Code Playgroud)
在 Linux 上,假设符号链接没有损坏,您可以使用readlink -f
规范化路径:
t=$(readlink -f -- "$file")
cd "${t%/*}"
Run Code Online (Sandbox Code Playgroud)
您可以使用readlink
来解析符号链接,然后dirname
获取其目录。
cdl () {
cd "$(dirname "$(readlink "$1")")";
}
Run Code Online (Sandbox Code Playgroud)
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$
Run Code Online (Sandbox Code Playgroud)