简体   繁体   中英

Why do some commands behave differently when run using a bash alias?

In developing with SVN, sometimes I want to just rollback all my changes and start fresh, so I put together a command to revert all the files in my checkout:

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

When I run 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 | perl -nale 'print $F[1] if /^M/' | xargs svn revert on the command line, the code works as expected: all my modified files get reverted, as verified with another svn status command. However, when I run svn-reset , I get output like the following:

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

In this example, I've verified that I have three modified files in my checkout, so it looks like the problem is with perl printing out the wrong information. However, I know hardly any perl, and I'm stumped as to why perl would behave differently run through a bash alias as compared to running the same perl code manually. Any thoughts?

This question is about why perl behaves differently when run using a bash alias. If anyone has any suggestions for a more efficient way to automatically revert all modified files in SVN, I'd be interested in that too, but that doesn't answer my question.

Try escaping the dollar, so that the shell does not substitute $F with nothing when you create the alias:

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

This is how your alias looks like to the shell

output from alias command:

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

after escaping the $ , it looks like this instead:

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

You used double quotes around the alias, so the shell is expanding the $F. Change it to (untested):

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM