在$ {花括号内部运行命令

时间:2017-01-07 02:20:49

标签: bash shell command command-substitution

我想使用别名HOME,这样就可以将我带到当前git项目的根目录,如果找不到它,就会把我带到正常的家庭目录。

我正在尝试将alias cd='HOME="${$(git rev-parse --show-toplevel):-~}" cd' 设置为git root,或者如果找不到,则将其设置为正常的home变量。

{{1}}

虽然不起作用。

2 个答案:

答案 0 :(得分:3)

你不能在${}内运行一个命令,除了在没有设置值的fallback子句中(在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 cd用于调用真正的cd实现而不是递归。

答案 1 :(得分: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'