0

我想使用别名cd,以便将我带到我当前 git 项目的根目录,如果找不到,它会将我带到我正常的主目录。

我正在尝试设置HOME为 git root,或者如果找不到,则设置为我的正常主变量。

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
}

笔记:

  • 使用函数可以让我们测试我们的参数列表、使用分支逻辑、拥有局部变量等等。
  • command cd用于调用真正的cd实现而不是递归。
于 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 回答