2011-01-14 13 views
1

私はgitを以下のように私のマシンにインストールしています。シンプルなbash関数がgitを理解しません

$ git --version 
git version 1.7.3.4 

I bashを使用しています、私はbashのプログラミングを学んでいると私は私がgitlabを実行したときしかし、私は、出力

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

を以下の取得私の〜/ .bashrcの

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

で関数を次のようしていますMacで。

+0

[BashFAQ/050](http://mywiki.wooledge.org/BashFAQ/050)をご覧ください。 –

答えて

3

問題は、CMD=の後のスペースです。これはCMD=<empty string> "git --version"と評価されます。まず、環境変数CMDが空の文字列に設定され、コマンドgit --versionが呼び出されます。 "..."のために、シェルは実際にはgit --versionというコマンドを実行しようとしており、--versiongitではないことに注意してください。この問題を解決するには、="の間のスペースを単純に削除します。

+0

+1です。私はそのスペースを見ませんでした。私はその質問をあまりにも早く読んだ。 –

+0

あなたはそれを持っています。それはスペースだった。他の人にはエイリアスを使用できますが、この例はより大きな機能のスナップショットです。みんな、ありがとう。 –

2

文字列全体を1つのコマンドとして実行しています。 foo barというバイナリ(には、の空白を入れてもかまいません)を表示することができます。

編集:実際に何をしようとしていますか?それを実行する前に変数にコマンドを格納する必要はありません:あなたは上記の関数から期待していたとして

gitlab() {git --version} 

alias gitlab='git --version' 

の両方が同じことを行います。一般的に、エイリアスの上に関数の解決法が推奨されています(そして、接頭辞の後にfunctionを付ける必要はありません)。

+0

私はあなたに従うことはありません。あなたは精緻化できますか?また、私はそれを修正するために変更する必要があります。 –

+0

あなたは半分の権利しか持っていません、私は恐れています:-) Sylvain Defrsneへの私のコメントを参照してください。 – DarkDust

0

変数に文字列"git --version"を割り当てようとすると、=の後に余分なスペースがあります。シェルはこれが空の文字列を次のコマンドのローカル変数であるCMD変数に代入したと考えます。あなたのコマンドが"で引用されているので、シェルはgit --versionというプログラムを実行しようとします。そのようなプログラムが存在しないので、失敗します。

あなたの関数が(エラーはここを参照してくださいする方が簡単です)、ほぼ次の関数のように解釈されます

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

あなたが意図したように、それは解釈持つように空白文字を削除する必要があります。しかし、同じことを行うための簡単な方法があります:あなたが欲しいもの、あなたがCMD変数に格納するgit --version実行結果を格納するためにだった場合

function gitlab() { 
    git --version 
} 

、あなたはそれをこのように行っている必要があります。

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

編集:間違っていたので返信を修正しました(エラーは@DarkDustによって検出されました)。

+0

彼は変数「CMD」にコマンドを割り当てない*で、等号の後のスペースに気づく。 'CMD =" git --version "; $ CMD'はうまく評価されますが、 'CMD =" git --version "; $ CMDは彼がやっていることです。 – DarkDust

+0

あなたは正しいです! D'oh!私の答えを訂正する、私のためだけに。 –

関連する問題