Trong zsh, có một công cụ sửa đổi cho điều đó, hay đúng hơn là hai: A
để giải quyết các liên kết tượng trưng (với realpath ) và h
để trích xuất phần đầu não (tức là dirname
).
cd $file(:A:h)
Điều này chỉ hoạt động nếu biểu tượng không bị hỏng. Nếu có một chuỗi các liên kết tượng trưng, nó được theo dõi cho đến khi mục tiêu cuối cùng. Nếu thư mục được truy cập thông qua một liên kết tượng trưng, bạn sẽ ở trong mục tiêu của nó (như với cd -P
).
Nếu không có zsh, nếu bạn có readlink
tiện ích và bạn muốn thay đổi thư mục chứa mục tiêu của liên kết tượng trưng:
cd -- "$(dirname -- "$(readlink -- "$file")")"
Mục tiêu của liên kết có thể là một liên kết tượng trưng. Nếu bạn muốn thay đổi thư mục chứa mục tiêu cuối cùng của liên kết, bạn có thể gọi readlink
trong một vòng lặp:
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
Trên Linux, giả sử symlink không bị hỏng, bạn có thể sử dụng readlink -f
để chuẩn hóa đường dẫn:
t=$(readlink -f -- "$file")
cd "${t%/*}"