2014-11-05 62 views
2

[注 - 我解決我遇到了使用bash函數的問題,但我想知道爲什麼我最初的嘗試沒有成功。]bash - 如何解釋別名?

我在Windows中運行git,並使用Gi​​t的bash命令行應用程序管理存儲庫。 我有幾個倉庫,我經常想要一次拉。以前我只是通過在命令行中輸入以下內容來完成此操作:

for i in *; do cd $i; git pull --rebase; cd ..; done; 

爲了節省時間,我決定爲此創建一個別名。所以,我創建的主目錄下的.bashrc文件(C:在我的情況/ GIT),並添加行

alias pr="for i in *; do cd $i; git pull --rebase; cd ..; done;" 

然而,這並沒有在所有的工作中,產量

sh.exe" cd: /etc/profile.d/*.sh: No such file or directory 

後面跟着git抱怨說它不在倉庫中。單次呼叫輸出將重複20次以上。 MinGW文件系統的根目錄(其中/ etc源自上面)是我將git安裝到(C:/ Program Files(x86)/ Git)的地方。現在

,我創造我的.bashrc文件中的函數,而不是解決到底這個問題,像這樣:

pr(){ 
    for i in * 
    do 
     cd $i 
     git pull --rebase 
     cd .. 
    done 
} 

所以,我的問題是解決了,但我想知道爲什麼我的初始方法不起作用。很明顯,有些別名我不明白,大概是,把'我'放在一邊。我的期望是bash會替換別名映射的字符串,然後對其進行評估,但似乎並不那麼簡單。

+2

如果在'pr'別名賦值和重新來源之前添加'echo「i = $ i」',會發生什麼? – BroSlow 2014-11-05 11:26:08

+2

此外,您可能希望將其短路條件'cd「$ i」&& git pull --rebase && cd ..'。否則,你可能會得到一些奇怪的結果('$ i'不是目錄,但你仍然運行'git'並向上移動一個等級......) – BroSlow 2014-11-05 11:34:56

+0

[bash alias命令可能帶有單引號和雙引號] (http://stackoverflow.com/questions/20111063/bash-alias-command-with-both-single-and-double-quotes) – tripleee 2014-11-05 13:36:46

回答

6

我還沒有完整分析這個,但它與你的$i在別名的時間擴展的時間有關。你這樣做,$i可能會在創建別名時被初始化。在函數版本中,它將在運行時解釋。嘗試定義的還有你的別名,然後運行:

alias pr # show how the alias is defined 

擊會很樂意推遲$ - 變量擴展,如果你用單引號定義的別名。以下應該和你的功能一樣。

alias pr='for i in *; do cd $i; git pull --rebase; cd ..; done;' 
+1

有人請解釋'-1' – BroSlow 2014-11-05 11:36:42

+0

+1這是絕對正確的;在別名被定義之前,雙引號內的'$ i'被擴展。當定義函數時,參數展開不是在單引號內執行的,或者是在函數體內(如發現的OP)執行的。 – chepner 2014-11-05 13:29:29

+0

啊哈,看來你是對的。 '別名pr'給出以下輸出: 'alias pr ='for in in *;做cd /etc/profile.d/*.sh; git pull --rebase; cd ..;完成;'' 所以這是'$ i'被擴展的問題,而不是像我想的那樣與'*'有關。 我已驗證它也可以與單引號一起使用。 – Jenesis 2014-11-05 14:00:44