zsh别名 -> 函数?

34

假设我有:

alias gg="git grep"

然后就是这样的东西:

gg "int x"

代码可以运行,但是存在一些问题。

gg int x

我经常遇到一些抱怨,如何在zsh中将gg重写为一个函数,以便它可以接收所有紧随其后的参数,并将它们放入一个字符串中?

谢谢!

2个回答

60
gg() { git grep "$*"; }

6
要让它们合并成一个字符串,你需要使用"$*"而不是"$@"--你现在使用的形式会将它们作为单独的参数传递,就像别名一样。 - Phil P
1
这样做的好处是也与bash兼容。 - Jian

6
对于您的特定用例来说,这是一个糟糕的想法。`git-grep`需要一个单参数的`pattern`。您试图让shell将空格(在int和x之间)视为模式的一部分。当您尝试像gg foo.*bar或其他各种shell可能解释的内容时,它很快就会崩溃。因此,gg后面的任何内容都应该被引用起来。这就是为什么git grep int x也无法工作的原因:fatal: ambiguous argument 'x': unknown revision or path not in the working tree... 如果您认为`gg`是一个值得输入的快捷方式,那么您应该保持您传递给它的参数与`git-grep`所期望的参数一致。您最初的别名对此很好。并且继续像对待任何其他接受正则表达式的命令一样使用单引号或双引号引用您的模式。

一方面,一个人说“我拒绝在使用情况中手动引用事物的人工需要”是非常合理的,另一方面,如果习惯性地不引用导致您意外忘记引用其他特殊的shell字符,那么这会给自己设置陷阱。但是,如果用户已经知情,选择前者并不一定是错误的。 - mtraceur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接