2011-01-14 43 views
1

我在我的機器上使用自制軟件安裝了git,如下所示。簡單的bash函數不理解git

$ git --version 
git version 1.7.3.4 

我學習bash編程,我已經在下面的函數我的〜/ .bashrc

function gitlab { 
    CMD= "git --version" 
    $CMD 
} 

然而,當我運行gitlab我獲得以下輸出

$ gitlab 
-bash: git --version: command not found 

我使用bash在Mac上。

+0

請參閱[BashFAQ/050](http://mywiki.wooledge.org/BashFAQ/050)。 – 2011-01-14 17:07:16

回答

3

您的問題是CMD=之後的空間。這評估爲CMD=<empty string> "git --version"。首先,將環境變量CMD設置爲空字符串,然後調用git --version命令。注意,由於"..."外殼真的試圖執行命令git --version而不是git與參數--version。簡單地刪除="之間的空間來解決這個問題。

2

您正在將整個字符串作爲單個命令運行。可以使用一個名爲foo bar的空格)的二進制文件,並且您可以按照您所示的方式運行它。

編輯:你究竟在做什麼?沒有必要在一個變量在運行之前存儲的命令:

gitlab() {git --version} 

alias gitlab='git --version' 

都做同樣的,你從上面的功能期待。一般來說,建議在別名之上使用功能解決方案(並且不需要在function前添加它)。

+0

我不追隨你。你能否詳細說明。還有什麼我需要改變來解決它。 – 2011-01-14 15:57:07

+0

你只知道它是對的,恐怕:-)請參閱我對Sylvain Defrsne的評論。 – DarkDust 2011-01-14 16:04:46

0

當您嘗試將字符串"git --version"分配給CMD變量時,在=之後有一個多餘的空格。 shell認爲這是將一個空字符串分配給CMD變量,該變量僅對下一個命令是本地的。由於你的命令是用"引用的,所以shell嘗試執行一個名爲git --version的程序。由於沒有這樣的程序存在,它失敗了。

你的函數被解釋幾乎像下面的函數(錯誤更容易看到這裏):

function() { 
    CMD= 
    "git --version" 
    unset -v CMD 
    $CMD 
} 

您應該刪除空格字符把它理解像你預期的。不過,也有更簡單的方法做同樣的事情:

function gitlab() { 
    git --version 
} 

如果你想要的是存儲git --version執行存儲在CMD變量的結果,你應該做這樣說:

function gitlab() { 
    VERSION="$(git --version)" 
    echo "$VERSION" 
} 

編輯:糾正我的回覆,因爲它是不正確的(錯誤發現@DarkDust)。

+0

不完全。他*不是*將命令分配給變量`CMD`,注意等號後面的空格。 `CMD =「git --version」; $ CMD`會評估得很好,但是`CMD =「git --version」; $ CMD`就是他在做的事情。 – DarkDust 2011-01-14 16:01:01