[英]bash - how is * interpreted in aliases?
[注意-我使用了bash函數解決了我遇到的問題,但是我想了解為什么我最初的嘗試不起作用。]
我在Windows中運行git,並使用Git Bash命令行應用程序來管理存儲庫。 我有幾個存儲庫,我經常想一次全部拉出。 以前,我只是通過在命令行中輸入以下命令來執行此操作的:
for i in *; do cd $i; git pull --rebase; cd ..; done;
為了節省時間,我決定為此創建一個別名。 因此,我在主目錄(本例中為C:/ git)中創建了一個.bashrc文件,並添加了以下行
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次以上。 我上面的/ etc所源自的MinGW文件系統的根是我將git安裝到(C:/ Program Files(x86)/ Git)的位置。
現在,我最終通過在.bashrc文件中創建一個函數來解決了這個問題,如下所示:
pr(){
for i in *
do
cd $i
git pull --rebase
cd ..
done
}
因此,我的問題已解決,但是我確實想了解為什么我的最初方法不起作用。 顯然有一些我不了解的別名,大概是在處理“ i in *”位。 我的期望是bash會替換別名映射到的字符串,然后對其進行評估,但這似乎並不那么簡單。
我尚未對此進行完整的分析,但這與別名中$i
擴展的時間有關。 這樣, $i
可能會在別名創建期間初始化。 在函數版本中,它將在運行時解釋。 嘗試按照所示定義別名,然后運行:
alias pr # show how the alias is defined
如果用單引號定義別名,Bash會很樂意推遲$
-variables的擴展。 以下內容應與您的功能一樣有效。
alias pr='for i in *; do cd $i; git pull --rebase; cd ..; done;'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.