Ich kenne also diesen pwd
und cd
in der Shell haben einen „logischen“ und einen „physikalischen“ Modus (siehe diese SO-Frage und die von dort verlinkten Fragen).
Nehmen wir nun an, ich habe diesen Symlink:
/home/<username>/foo -> /tmp/bar
Um lokal mitzumachen, tun Sie einfach Folgendes:
mkdir /tmp/bar
ln -s /tmp/bar ~/foo
Jetzt, wenn ich in meinem $HOME
starte und cd
in foo
, erhalte ich mit pwd
den „logischen“ Pfad (mit Standardeinstellungen). , und kann den „physischen“ Pfad mit -P
erhalten :
$ cd ~/foo
$ pwd
/home/<username>/foo
$ pwd -P
/tmp/bar
Natürlich „..
“ bezieht sich immer auf den übergeordneten Pfad des „physischen“ Pfads (mein Verständnis ist, dass es nicht einmal von der Shell interpretiert wird, sondern nur unverändert an den Befehl übergeben wird, und einige spezielle eingebaute Befehle wie cd
interpretieren Sie es speziell, um das „logische“ Verhalten zu erhalten):
$ pwd
/home/<username>/foo
$ realpath ..
/tmp
Was ich will, ist, wenn ich mich in $HOME/foo
befinde (oder eines seiner Unterverzeichnisse), dass alle relativen Pfade, die ich verwende (z. B. ls -l ../..
) relativ zum „logischen“ Pfad interpretiert/erweitert werden (es ist in Ordnung, wenn ich meinem Befehl etwas voranstellen muss).
Zum Beispiel:
$ pwd
/home/<username>/foo
$ vi ../something.txt
Ich möchte, dass dies zu vi /home/<username>/something.txt
aufgelöst wird .
Gibt es etwas Einfacheres/Kürzeres, als Folgendes zu tun (oder eine Shell-Funktion zu schreiben, die ich meinem Befehl voranstellen kann, die alle Argumente durchgeht und – wenn sie sich auf Pfade beziehen – sie erweitert, bevor sie an den Befehl übergeben werden)?
$ pwd
/home/<username>/foo
$ realpath -L $PWD/../something.txt
/home/<username>/something.txt
$ vi $(realpath -L $PWD/../something.txt)
Gibt es so etwas wie eine „logische Pfaderweiterung für Befehlszeilenparameter, die relative Dateipfade sind, die ausgeführt werden, bevor die Shell den Befehl ausführt“? Ich verwende zsh
, aber alle Lösungen für bash
oder zsh
wäre in Ordnung.
Akzeptierte Antwort:
Ich werde dies für Zsh beantworten, da ich das verwende.
Um den gewünschten Effekt zu erzielen, verwenden Sie ..
bei Verwendung von cd
, fügen Sie einfach Folgendes zu Ihrem ~/.zshrc
hinzu Datei:
setopt NO_chase_dots NO_chase_links
Dokumentation hier:http://zsh.sourceforge.net/Doc/Release/Options.html#index-CHASEDOTS
In allen anderen Fällen statt ..
, müssen Sie den :h
verwenden Erweiterungsmodifikator („Kopf“):
$ pwd
/home/<username>/foo
$ vi $PWD:h/something.txt
Wenn Sie mehr als eine Ebene erreichen müssen, können Sie eine Zahl daran anhängen (vorausgesetzt, Sie umgeben den Ausdruck mit geschweiften Klammern) oder einfach das :h
wiederholen :
# These two are equivalent:
$ vi ${PWD:h2}/foo
$ vi $PWD:h:h/foo
Dokumentation hier:http://zsh.sourceforge.net/Doc/Release/Expansion.html#Modifiers