2017-01-07 2 views
0

cd私は現在のgitプロジェクトのルートに移動します。見つからない場合は、私の通常のホームディレクトリに移動します。

私はHOMEをgit rootに設定しようとしています。見つからなければ、私の通常のホーム変数に設定しようとしています。

alias cd='HOME="${$(git rev-parse --show-toplevel):-~}" cd' 

でも動作しません。

答えて

3

値が設定されていない場合のフォールバック句(POSIX shまたはbash;すべての奇妙な構文を許可するzshで実現可能かもしれません)の場合を除き、コマンドを${}の中で実行することはできません。

機能を使用している場合に関係なく、はるかに少ないねじれが必要とされています

# yes, you can call this cd, if you *really* want to. 
cdr() { 
    if (($#)); then 
    command cd "[email protected]" 
    else 
    local home 
    home=$(git rev-parse --show-toplevel 2>/dev/null) || home=$HOME 
    command cd "$home" 
    fi 
} 

注:

  • 機能を使用するには、私たちは、私たちの引数リストをテストする分岐ロジックを使用して、ローカル変数を持って、&することができますc。
  • command cdは、再呼び出しではなく実際のcd実装にコールスルーするために使用されます。
+0

'command cd'と' builtin cd'はどちらですか?私はこれまでに書いたすべての関数に 'builtin'を使っています:/ – theonlygusti

+0

' $(git rev-parse --show-toplevel) 'のstderrを隠すことは可能ですか? git reposがなければエラーとなります。 – theonlygusti

+0

もちろん。サブシェルの中に '2/dev/null'を入れてください。 –

2

もちろん、パラメータ拡張内でコマンドを実行することは可能です。
まあ、唯一の障害側、つまり:あなたは障害側を使用している場合

$ unset var 
$ echo ${var:-"$(echo "hello world!")"} 

だから、あなたはgitのコマンドが実行されることがあります。

unset var 
var=${var:-"$(git rev-parse --show-toplevel 2>/dev/null)"}" 

しかし、それが持つシンプルな次のようになります:そのVARと仮定すると は空です

var="$(git rev-parse --show-toplevel 2>/dev/null)" 

そして、varはその後も空の場合、使用:

HOME=${var:-~} builtin cd 

こと利回り:

var="$(git rev-parse --show-toplevel 2>/dev/null)"; HOME=${var:-~} builtin cd 

別名で次のように使用される可能性があります。

alias cdr='var="$(git …)"; HOME=${var:-~} builtin cd' 
+0

これは私が探していた元の答えです。 – theonlygusti

+0

賢い。ブラボー!! –