0

現在の git プロジェクトのルートに移動できるようにエイリアスを設定したいのですcdが、それが見つからない場合は、通常のホーム ディレクトリに移動します。

git ルートに設定しようとしてHOMEいますが、それが見つからない場合は通常のホーム変数に設定しようとしています。

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

しかし、うまくいきません。

4

2 に答える 2

3

値が設定されていない場合のフォールバック句を除いて、内でコマンドを実行することはできません${}(POSIX sh または bash では、あらゆる種類の奇妙な構文が許可される zsh で実行可能である可能性があります)。

とにかく、関数を使用する場合、必要なゆがみははるかに少なくなります。

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

ノート:

  • 関数を使用すると、引数リストをテストしたり、分岐ロジックを使用したり、ローカル変数を使用したり、&c したりできます。
  • command cdcd再帰ではなく、実際の実装を呼び出すために使用されます。
于 2017-01-07T02:31:53.797 に答える
2

もちろん、パラメータ展開内でコマンドを実行することは可能です。
まあ、失敗の側だけで、それは次のとおりです。

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

そのため、失敗側を使用すると、git コマンドが実行される場合があります。var が空であると仮定します。

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

しかし、それは次のようにするとより簡単になります:

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'
于 2017-01-07T13:16:12.473 に答える