2009-12-02 75 views
2

我经常输入这个命令,并试图对它进行别名,而且由于某种原因不能。ssh命令的bash别名管道传输给awk

for FILE in `svn stat | awk '{print $2}'`; do svn revert $FILE; done 

这显然做了大量的svn恢复。

当我别名是:

alias revert_all="for FILE in `svn stat | awk '{print $2}'`; do svn revert $FILE; done" 

SVN统计立即运行 - 没有好

然后我尝试双引号awk的部分:

alias revert_all='for FILE in `svn stat | awk "{print $2}"`; do svn revert $FILE; done' 

但是,这并不正常运行 - awk部分不执行(我得到M值显示并尝试运行svn恢复M)。

下试试,用转义单引号打勾:

alias revert_all='for FILE in `svn stat | awk \'{print $2}\'`; do svn revert $FILE; done' 

该命令不完整,庆典正在等待另一个蜱?

我知道我可以编写脚本,或者将awk命令放在文件中,但我没有寻找解决方法。这里有一些我不知道的东西。它是什么?

TIA

回答

1

反向使得获取报价权非常困难。

试试这个:

alias revert_all='for FILE in $(svn stat | awk '{print $2}'); do svn revert "$FILE"; done' 

使用$()允许里面的报价是独立外面的引号。

最好总是使用$()never use backticks

+0

$()的问题在于它不是可移植的,而bash虽然非常流行,但并不是无处不在。 – mouviciel 2009-12-04 10:10:18

+1

嗯... POSIX指定'$()':http://www.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_03 - 除了问题被标记为“[bash]” – 2009-12-04 14:00:26

3

我不是你是不是有趣的解决方法,但似乎尽可能多的原生方式。不要别名,而是定义为功能,并把.bashrc中:

revert_all() { for FILE in `svn stat | awk '{print $2}'`; do svn revert $FILE; done} 

只是测试:

alias revert_all="for FILE in \`svn stat | awk '{print $2}'\`; do svn revert $FILE; done" 

作品。

1

最简单的方法是避免反引号完全:

 
svn stat | awk '{print $2}' | while read FILE; do svn revert $FILE; done 

其次是使用eval。

+0

为什么有人不喜欢这个? – 2009-12-02 16:34:33

+0

其中几个原因之一:未能使用xargs(很多人喜欢xargs),模糊的回应w.r.t. eval,或者很可能是因为正确的解决方案是使用函数而不是别名。 – 2009-12-03 02:21:04

2

难道你不能只做svn revert --recursive

2

为什么要使用别名?将其定义为一个函数并将其放入一个文件中。这将充当“图书馆”。当您想使用该功能时,请将其源码放入脚本中。