GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Zsh/bash:Erweitern Sie relative Pfade in Befehlsargumenten mithilfe von Regeln für die logische Verzeichnisstruktur vor der Ausführung?

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


Linux
  1. Befehlszeilenargumente an Bash-Skript übergeben?

  2. Warum ist das Setzen einer Variablen vor einem Befehl in Bash legal?

  3. Verwendung von –exclude mit dem Du-Befehl?

  4. Ausgabe des Befehls nach Spalten mit Bash aufteilen?

  5. Stellen Sie die relative Zeit über die Befehlszeile ein

So zeigen Sie die Verzeichnisbaumstruktur in Linux an

So wechseln Sie automatisch zu einem Verzeichnis, ohne den Cd-Befehl in Linux zu verwenden

Verschiedene Möglichkeiten zum Auflisten von Verzeichnisinhalten ohne Verwendung des Befehls ls

Bash-Skripting – Analysieren Sie Argumente in Bash-Skripten mithilfe von getopts

Wie drucke ich das Arbeitsverzeichnis mit dem Linux-Befehl pwd?

Verwenden des Linux-Dirname-Befehls in Bash-Skripten