bashrc惰性替换


10

如何在运行时而不是在执行〜/ .bashrc时(打开终端时)获得~/.bashrc别名来评估$()替换

我经常运行此命令,以便为其添加别名:

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

但是,当我将其添加~/.bashrc为别名时,我看到评估被硬编码为它们在打开终端时所具有的值:

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

如果我在其中打开终端,~则会收到错误消息:

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'
$

我已经尝试了中的别名的这两种变体~/.bashrc,它们都具有相同的效果(正如我预期的那样):

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"

如何在运行时获取~/.bashrc别名以评估$()替换

此外,如何在Google中搜索这种情况?我曾尝试在Google上搜索“ bashrc替换”,“ bashrc惰性替换”和其他关键短语,但对于我觉得应该是一个足够普遍的问题来查找信息,我一无所获。


2
为什么必须是别名?将其移至Shell脚本并完成操作。如今$HOME/binPATH如果您有这样的目录,大多数* ix类型的系统都会放入。
沃伦·杨

@WarrenYoung:您是正确的,此特定实例可以是脚本。但是,我仍然想知道答案,因为我确实更喜欢将别名用于其他事物,并且我一定会碰到这个。我可以将您的问题概括为“当任何东西都可能是脚本时,为什么Bash支持别名”。
dotancohen

为什么要下票?我该如何改善这个问题?我提供了示例,失败的尝试,甚至是我尝试搜索的关键字短语。
dotancohen

@dotancohen:我认为您应该单独询问。我会在这里给出部分答案:alias cdp="cd ~/projects"。在Shell脚本中无法做到这一点。
沃伦·杨

Answers:


11

使用单引号禁止处理特殊字符。你也可以反斜线 $秒。

对于复杂的命令,在任何情况下都最好使用一个函数,该函数不需要任何转义并且更易于阅读和编辑:

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

您可以在任何可以定义别名的地方定义一个函数。


2
awk也具有模式空间,awk '/^Revision/{ print ...}' 因此在这种情况下不需要grep。
Valentin Bajrami 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.