使用bash别名运行时,为什么某些命令的行为会有所不同?

时间:2011-06-30 13:50:58

标签: perl svn bash alias

在使用SVN进行开发时,有时我想回滚所有更改并重新开始,所以我将一个命令放在一起以恢复我的结帐中的所有文件:

alias "svn-reset"="svn status | perl -nale 'print $F[1] if /^M/' | xargs svn revert"

当我在命令行上运行svn status | perl -nale 'print $F[1] if /^M/' | xargs svn revert时,代码按预期工作:我的所有修改过的文件都被还原,正如另一个svn status命令验证的那样。但是,当我运行svn-reset时,我得到如下输出:

$ svn-reset
Skipped 'ARRAY(0x1c2f52a0)'
Skipped 'ARRAY(0x1c2f5450)'
Skipped 'ARRAY(0x1c2f5410)'

在这个例子中,我已经验证我的结帐中有三个修改过的文件,所以看起来问题是perl打印出错误的信息。但是,我几乎不知道任何perl,并且我很难理解为什么perl在通过bash别名运行时会表现得与手动运行相同的perl代码相比。有什么想法吗?

这个问题是关于为什么perl在使用bash别名运行时表现不同的原因。如果有人对更有效地自动恢复SVN中所有修改过的文件有任何建议,我也会对此感兴趣,但这不能回答我的问题。

3 个答案:

答案 0 :(得分:3)

尝试转义美元,以便在创建别名时shell不会替换$F

alias svn-reset="svn status | perl -nale 'print \$F[1] if /^M/' | xargs svn revert"

答案 1 :(得分:3)

这就是你的别名对shell的看法

alias命令输出:

alias svn-reset='svn status | perl -nale '\''print [1] if /^M/'\'' | xargs svn revert'
转义$后,它看起来像这样:

alias svn-reset='svn status | perl -nale '\''print $F[1] if /^M/'\'' | xargs svn revert'

答案 2 :(得分:1)

你在别名周围使用双引号,所以shell正在扩展$ F.将其更改为(未经测试):

alias "svn_reset"="svn status | perl -nale 'print \$F[1] if /^M/' | xargs svn revert"