tags:

views:

267

answers:

5

I type in this command frequently, and was trying to alias it, and couldn't for some reason.

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

This obviously does a large number of svn reverts.

when I alias it:

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

svn stat runs immediately - no good

Then I try double-quoting the awk portion:

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

but this does not run properly - the awk portion does not execute (I get the M values showing up and try to run svn revert M).

next try, with escaped single tick quotes:

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

The command does not complete, bash is waiting for another tick?

I know I could script this, or put the awk command in the file, but I'm not looking for a workaround. There is something here I don't know. What is it?

TIA

+3  A: 

I not you are not interesting in workarounds, but seem as much native way. Do not alias, but define as function and put .bashrc:

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

Just tested:

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

works.

Artem Barger
+1  A: 

The simplest way is to avoid the backticks completely with:

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

The next is to use eval.

William Pursell
Why did someone downvote this?
Dennis Williamson
one of several reasons: failure to use xargs (lots of people love xargs), vague response w.r.t. eval, or most likely because the proper solution is to use a function instead of an alias.
William Pursell
+2  A: 

Can’t you just do svn revert --recursive?

Michael Hackner
A: 

Backticks make getting the quoting right very difficult.

Try this:

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

Using $() allows quotes inside it to be independent of quotes outside it.

It's best to always use $() and never use backticks.

Dennis Williamson
The problem with $() is that it's not portable and bash, though very popular, is not installed everywhere.
mouviciel
Hmmm... POSIX specifies `$()`: http://www.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_03 - besides the question is tagged "[bash]"
Dennis Williamson
+1  A: 

why do you want to use alias? define it as a function and put it inside a file. This will act as a "library". When you want to use the function, source it in your scripts.