2009-12-02 73 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

爲什麼要使用別名?將其定義爲一個函數並將其放入一個文件中。這將充當「圖書館」。當您想使用該功能時,請將其源碼放入腳本中。