我为我的 git log 命令添加了别名:
$ alias gl
alias gl='gn -c git log -w -b -p --ignore-blank-lines --full-history'
$ alias gn
alias gn='git-number'
命令的 -n 标志
git-number
运行子命令,就像sh -c
那样。
我注意到一件奇怪的事。当我跑步时:
gl -- lib/X.pm
它的工作原理如下:
gn -c "git log -w -b -p --ignore-blank-lines --full-history" -- lib/X.pm
但我希望这样(不是字符串末尾的引号):
gn -c "git log -w -b -p --ignore-blank-lines --full-history -- lib/X.pm"
以下是命令的完整历史记录:
$ gl -- lib/X.pm
fatal: ambiguous argument 'lib/X.pm': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
$ gn -c "git log -w -b -p --ignore-blank-lines --full-history" -- lib/X.pm
fatal: ambiguous argument 'lib/X.pm': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
$ gn -c "git log -w -b -p --ignore-blank-lines --full-history -- lib/X.pm"
commit 9ce3e165f284d55503eff9b627ef3723854c53bb
...other expected output
如何强制alias
将别名选项和新选项放在一起?
别名是命令行上文本对字符串的“哑”替换。别名不能使用参数或除了提供文本来替换别名之外做任何事情。在您的示例中,您希望在别名之后获取参数并将它们插入到调用的命令中
git-number
。由于别名不理解参数,因此无法执行此操作。使用外壳函数。下面的 shell 函数假定其工作方式与为实用程序执行的命令提供参数方面的
git-number -c
工作方式完全相同:sh -c
此 shell 函数将调用
git-number -c
您的git log
命令,后跟任意选择的字符串gc
(如果git-number -c
行为类似于sh -c
,将放置在$0
执行的 shell 中git log
)和"$@"
函数的引用参数。该
git log
命令将(同样,提供的git-number -c
工作方式与sh -c
)使用设置的参数调用,后跟 shell 函数传入的参数。gn
使用两个参数调用此函数--
,lib/X.pm
最终将调用git log
(通过git-number -c
)使用额外的参数,--
后跟lib/X.pm
。由于我们正在努力正确传递参数,这也将支持传递包含空格和换行符等的参数。如果我们简单地注入 到从 shell 函数
$@
调用的命令中,这是不可能的。git-number -c