![](/img/trans.png)
[英]Why do printf and sprintf behave differently when only given an array?
[英]Why do some commands behave differently when run using a bash alias?
在使用 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 | 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
時,我得到 output 如下所示:
$ svn-reset
Skipped 'ARRAY(0x1c2f52a0)'
Skipped 'ARRAY(0x1c2f5450)'
Skipped 'ARRAY(0x1c2f5410)'
在此示例中,我已驗證我的結帳中有三個已修改的文件,因此看起來問題出在 perl 打印出錯誤信息。 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. 有什么想法嗎?
這個問題是關於為什么 perl 在使用 bash 別名運行時表現不同。 如果有人對自動還原 SVN 中所有修改文件的更有效方法有任何建議,我也會對此感興趣,但這並不能回答我的問題。
嘗試 escaping 美元,以便在創建別名時 shell 不會用任何內容替換$F
:
alias svn-reset="svn status | perl -nale 'print \$F[1] if /^M/' | xargs svn revert"
這就是您的別名在 shell 中的樣子
output 來自alias
命令:
alias svn-reset='svn status | perl -nale '\''print [1] if /^M/'\'' | xargs svn revert'
在 escaping $
之后,它看起來像這樣:
alias svn-reset='svn status | perl -nale '\''print $F[1] if /^M/'\'' | xargs svn revert'
您在別名周圍使用了雙引號,因此 shell 正在擴展 $F。 將其更改為(未經測試):
alias "svn_reset"="svn status | perl -nale 'print \$F[1] if /^M/' | xargs svn revert"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.