在使用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中所有修改过的文件有任何建议,我也会对此感兴趣,但这不能回答我的问题。
答案 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"