如何为 git 别名设置命令行参数的默认值?

Nor*_*yan 2 git bash shell

我正在尝试添加一个别名,.gitconfig如果没有命令行参数,该别名应解析为默认值。

lgs = "!f() { git log --stat $1; }; f" 
Run Code Online (Sandbox Code Playgroud)

git lgs应该打印最后一次提交的统计日志。 git lgs -2- 应打印最后 2 次提交的统计日志。(这个正在工作)。

我尝试了几种选择但没有结果

  • lgs = "!f() { git log --stat $1:=-1; }; f"
  • lgs = "!f() { git log --stat $1:-1; }; f"
  • lgs = "!f() { git log --stat $1=-1; }; f"

我怎样才能正确实施它?

tor*_*rek 6

${1--1}我想,你想要这里。

解释

Git 别名由 POSIX 风格的 shell ( ) 运行sh。POSIX shell 有:

${variable-default}
Run Code Online (Sandbox Code Playgroud)

和:

${variable:-default}
Run Code Online (Sandbox Code Playgroud)

作为扩展选项,如果$variable未设置,则改为default。该:-变体看起来有点像旧式表情符号之一,意思是“如果设置了变量但扩展为空字符串,则使用默认值”。

大多数情况下我们在这里使用变量名称,例如:

somevar=somevalue
Run Code Online (Sandbox Code Playgroud)

或者:

anothervar=$(git ls-files --stage -- file.ext)
Run Code Online (Sandbox Code Playgroud)

例如,然后我们就会有${somevar-default}. 但$1是第一个位置参数,$2是第二个位置参数,依此类推,这些也适用于这些位置。

在这种情况下,您想要的默认值是-1so ${1--1},确实看起来很有趣,但确实有效。

请注意,Vogel612 的评论非常接近,因为这些 shell 也有:

${variable=default}
Run Code Online (Sandbox Code Playgroud)

和:

${variable:=default}
Run Code Online (Sandbox Code Playgroud)

其行为类似(如果变量未设置,则扩展为默认值,在第二种情况下,如果变量也设置为空字符串),但也具有设置变量的副作用。当与 no-op :(冒号)命令一起使用时,这特别有用:

f() {
    local name="$1" email="$2"
    : ${name:="default name"} ${email:="<default.email@somewhere.com>"}
    # now you can refer to "$name" and "$email";
    # they are set and non-empty, even if someone passed the
    # empty string as arguments 1 and/or 2.
}
Run Code Online (Sandbox Code Playgroud)

(不幸的是local,该构造虽然非常广泛可用并且通常是一个好主意,但不在 POSIX 中sh。最近我很惊讶地发现了这一点。它可以防止变量“逃逸”函数的范围。幸运的是,对于一次性函数Git 别名,不需要。)