引用别名命令的参数。这是如何运作的?

引用别名命令的参数。这是如何运作的?

我为 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 函数调用的命令。

相关内容