簡體   English   中英

bash-如何用別名解釋*?

[英]bash - how is * interpreted in aliases?

[注意-我使用了bash函數解決了我遇到的問題,但是我想了解為什么我最初的嘗試不起作用。]

我在Windows中運行git,並使用Gi​​t 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.

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