Bevor ich ein Skript schreibe, kennt jeder eine einfache Möglichkeit, Folgendes zu tun:
$ 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
dh im Verzeichnis /foo/bar
möchte ich so etwas wie cdl
(CD-Link) machen, das mich zum Verzeichnis der verknüpften Datei (oder alternativ zum verknüpften Verzeichnis, falls dies der Fall wäre - wenn ich es wäre) führen würde könnte tippen cd -P /bar
).
shell
zsh
symlink
cd-command
Chauncey Garrett
quelle
quelle
Antworten:
In zsh gibt es dafür einen Modifikator oder vielmehr zwei:
A
symbolische Verknüpfungen (mit realpath ) aufzulösen undh
den „Kopf“ (dh dendirname
) zu extrahieren .Dies funktioniert nur, wenn die Symbolik nicht gebrochen ist. Wenn es eine Kette symbolischer Glieder gibt, wird diese bis zum endgültigen Ziel verfolgt. Wenn das Verzeichnis über einen symbolischen Link erreicht wurde, befinden Sie sich im Ziel (wie bei
cd -P
).Ohne zsh, wenn Sie das
readlink
Dienstprogramm haben und in das Verzeichnis wechseln möchten, das das Ziel des symbolischen Links enthält:Das Ziel des Links könnte selbst ein Symlink sein. Wenn Sie in das Verzeichnis wechseln möchten, das das endgültige Ziel des Links enthält, können Sie
readlink
in einer Schleife Folgendes aufrufen :Unter Linux können Sie
readlink -f
den Pfad kanonisieren, sofern der Symlink nicht unterbrochen ist :quelle
cd $file(:A:h)
ist genau das, wonach ich gesucht habe!Sie können
readlink
den symbolischen Link auflösen und danndirname
sein Verzeichnis abrufen.quelle
$()
anstelle von Backticks verwendet wird.eine Linie:
quelle