【问题标题】:How to set a default value for command line parameter for git alias?如何为 git 别名的命令行参数设置默认值?
【发布时间】:2021-12-30 04:35:35
【问题描述】:

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

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

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"

如何正确实现?

【问题讨论】:

  • 这可能取决于你的shell。假设 bash 将给 lgs = "!f() { git log --stat ${1:=-1}; }; f" 作为通常的 bash 默认值
  • f() { git log --stat ${1:=-1}; }; f: 1: f() { git log --stat ${1:=-1}; }; f: 1: 错误的变量名
  • @Vogel612:Git 别名由 POSIX 样式的 shell (sh) 运行,并且 sh 具有相同类型的默认值,但您只需扩展:${1:--1} in在这种情况下,如果你想让一个空但设置的$1 扩展为-1,或者如果你想让设置但为空的$1 扩展为空字符串,则${1--1}
  • 是的,它奏效了。请把它作为答案。 lgs = "!f() { git log --stat ${1:--1}; }; f"
  • @torek 因为您似乎明确知道(并且 OP 确认它有效),您可能希望将其作为答案发布:)

标签: bash git shell


【解决方案1】:

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

说明

Git 别名由 POSIX 样式的 shell (sh) 运行。 POSIX shell 有:

${variable-default}

和:

${variable:-default}

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

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

somevar=somevalue

或:

anothervar=$(git ls-files --stage -- file.ext)

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

在这种情况下,您想要的默认值是 -1 所以${1--1},诚然看起来很有趣,有效。

请注意,Vogel612's comment 非常接近,因为这些 shell 也有:

${variable=default}

和:

${variable:=default}

其行为类似(如果未设置变量,则扩展为默认值,并且在第二种情况下,如果变量也设置为空字符串),但也具有 设置 的副作用多变的。这在与 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.
}

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

【讨论】:

  • 是的。例如git config --global alias.lgdo '!f(){ git log --graph --decorate --oneline "${@---all}"; }; f' 提供无参数默认设置。
猜你喜欢
  • 2017-03-08
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-30
  • 2022-01-16
  • 2013-09-12
  • 1970-01-01
相关资源
最近更新 更多