簡體   English   中英

為什么某些命令在使用 bash 別名運行時表現不同?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM