我为 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
将别名选项和新选项放在一起?
答案1
别名是命令行上的文本对字符串的“愚蠢”替换。别名不能使用参数或执行任何操作,只能提供文本来替换别名。在您的示例中,您希望在别名后面采用参数插入将它们放入由 调用的命令中git-number
。由于别名不理解参数,因此它无法执行此操作。
使用外壳函数。下面的 shell 函数假设其git-number -c
工作方式sh -c
与向实用程序执行的命令提供参数完全相同:
gl () {
git-number -c 'git log -w -b -p --ignore-blank-lines --full-history "$@"' gn "$@"
}
该 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
(via ) ,后跟。git-number -c
--
lib/X.pm
gn -c "git log -w -b -p --ignore-blank-lines --full-history -- -- lib/X.pm"
由于我们正在努力正确地传递参数,这也将支持传递包含空格和换行符等的参数。如果我们简单地这样做,这是不可能的注入 $@
git-number -c
进入shell 函数调用的命令。