Bashrc faule Substitution

10

Wie erhält man ~/.bashrcAliase, um $()Substitutionen zur Laufzeit auszuwerten , anstatt zum Zeitpunkt der Ausführung von ~ / .bashrc (beim Öffnen eines Terminals)?

Ich führe diesen Befehl oft genug aus, um einen Alias ​​dafür hinzuzufügen:

svn diff -r $(svn info | grep ^Revision | awk {'print $2'}):HEAD $(svn info | grep ^URL | awk {'print $2'}) | colordiff

Wenn ich es jedoch ~/.bashrcals Alias hinzufüge , sehe ich, dass die Auswertungen fest auf die Werte codiert sind, die sie zum Zeitpunkt des Öffnens des Terminals hatten:

$ alias
alias svnbranch='svn diff -r 178184:HEAD svn+ssh://branches/t4252 | colordiff'

Wenn ich ein Terminal öffne, ~erhalte ich folgende Fehler:

svn: E155007: '/home/dotancohen' is not a working copy
svn: E155007: '/home/dotancohen' is not a working copy
svn: E155007: '/home/dotancohen' is not a working copy
svn: E155007: '/home/dotancohen' is not a working copy
$ alias
alias svnbranch='svn diff -r :HEAD  | colordiff'
$

Ich habe diese beiden Variationen des Alias ​​ausprobiert. ~/.bashrcBeide haben den gleichen Effekt (wie ich erwartet hatte):

alias svnbranch="svn diff -r $(svn info | grep ^Revision | awk {'print $2'}):HEAD $(svn info | grep ^URL | awk {'print $2'}) | colordiff"
alias svnbranch="svn diff -r `svn info | grep ^Revision | awk {'print $2'}`:HEAD `svn info | grep ^URL | awk {'print $2'}` | colordiff"

Wie erhält man ~/.bashrcAliase, um $()Substitutionen zur Laufzeit zu bewerten ?

Wie würde man außerdem in Google nach dieser Situation suchen? Ich habe versucht, auf "bashrc substitution", "bashrc lazy substitution" und andere Schlüsselbegriffe zu googeln, aber ich habe nichts gefunden, was meiner Meinung nach häufig genug sein sollte, um Informationen zu finden.

dotancohen
quelle
2
Warum muss es ein Alias ​​sein? Verschieben Sie es in ein Shell-Skript und fertig. Die meisten Systeme vom Typ * ix werden $HOME/binin das PATHVerzeichnis gestellt, wenn Sie heutzutage ein solches Verzeichnis haben.
Warren Young
@ WarrenYoung: Sie haben Recht, diese bestimmte Instanz könnte ein Skript sein. Ich würde die Antwort jedoch immer noch gerne wissen, da ich Aliase für andere Dinge bevorzuge, und ich werde auf jeden Fall darauf stoßen. Ich könnte Ihre Frage verallgemeinern in "Warum unterstützt Bash Aliase, wenn irgendetwas ein Skript sein könnte?".
Dotancohen
Warum das Downvote? Wie könnte ich die Frage verbessern? Ich habe Beispiele, fehlgeschlagene Versuche und sogar die Schlüsselwörter angegeben, mit denen ich googeln wollte.
Dotancohen
@dotancohen: Ich denke, du solltest das separat fragen. Ich werde hier eine teilweise Antwort geben : alias cdp="cd ~/projects". Das geht in einem Shell-Skript nicht.
Warren Young

Antworten:

11

Verwenden Sie einfache Anführungszeichen , um die Verarbeitung von Sonderzeichen zu unterdrücken. Sie könnten auch die s rückwärts schlagen. $

Für einen komplexen Befehl ist es wahrscheinlich in jedem Fall besser, eine Funktion zu verwenden, die kein Escapezeichen erfordert und einfacher zu lesen und zu bearbeiten ist:

svnbranch() {
    svn diff -r $(svn info | grep ^Revision | awk {'print $2'}):HEAD $(svn info | grep ^URL | awk {'print $2'}) | colordiff
}

Sie können eine Funktion überall dort definieren, wo Sie einen Alias ​​definieren können.

Michael Homer
quelle
2
awkhat auch einen Musterraum awk '/^Revision/{ print ...}' Also braucht man in diesem Fall kein grep.
Valentin Bajrami