如何使用部分参数创建 zsh/bash 宏

如何使用部分参数创建 zsh/bash 宏

我想在 my 中创建一些函数/别名.zshrc来帮助 git,但我不知道如何做。

第一:

完整命令:git commit -s -m "My message"

我想要的最终结果:gsc -m "My message"

第二个:

完整命令:git commit -s -a -m "My message"

我想要的最终结果:gsca "My message"

正如你所看到的,我想要一个宏,它可以调用带有部分参数的东西,并接受所有其他参数,无论它们来自这个宏调用。

我尝试过的:

  1. function gsc() { git commit -s $@; }
  2. alias gsc='git commit -s'

这些都不起作用。

我的测试:

> gsc -a -m "test"
On branch main
Your branch is up to date with 'origin/main'.

Untracked files:
  (use "git add <file>..." to include in what will be committed)
    smth.txt

nothing added to commit but untracked files present (use "git add" to track

答案1

这里:

function gsc() { git commit -s $@; }

使用未引用的 $@意味着该函数的任何参数都将经过分词,例如调用gsc -m "hello there"最终将git使用参数commit, -s, -m, hello, 和进行调用there,即使用应该将提交消息拆分为不同参数的内容,就像您运行了一样git commit -s m hello there在 shell 命令行上。

您需要将扩展​​引用为"$@"。另外,function foo它是一个 ksh-ism,它与标准 等效foo()。所以:

gsc() { git commit -s "$@"; }

另一方面,别名

alias gsc='git commit -s'

看起来应该可以。别名仅在解析命令行之前替换其内容,因此gsc -m "hello there"应该完全等同于git commit -s -m "hello there".

尽管您可能想确保在测试时没有同时定义别名和函数。这肯定会引起混乱。

答案2

您的解决方案是正确的,并且测试表明它按预期工作。通过在短命令旁边键入完整命令并验证是否获得相同的结果,您应该会看到它确实按预期工作。换句话说,在运行gsc -a -m "test"并看到“没有添加任何内容到提交”之后,运行git commit -s -a -m "test"并验证它的行为是否相同。

我建议使用别名而不是函数。首先,它将允许自动补全工作。其次,您将避免常见的错误,例如缺少双引号$@- 函数中存在的错误gsc

相关内容