尝试创建收集并引用所有参数的 bash 函数,但如果参数包含括号或单引号,则该函数不起作用

尝试创建收集并引用所有参数的 bash 函数,但如果参数包含括号或单引号,则该函数不起作用

我在某处看到建议使用以下“git commit”的快捷方式:

function gc {
  git commit -m "$*"
}

这应该允许您在 shell 中内联编写提交消息,无需引号或任何其他内容。例如:

gc This is a commit message

问题是,如果提交消息本身包含括号或引号,它似乎不起作用。(我在提交消息中使用了很多括号/引号。)有谁精通 bash 脚本艺术,可以建议一个更好的快捷方式吗?

答案1

我不认为这是你的函数的问题(或者更准确地说,我不认为这是你可以在你的函数中解决的问题)。bash 在调用你的函数之前会解析命令行(包括解释带引号的字符串、各种括号表达式等)——甚至在它调用你的函数之前。决定调用你的函数。因此,当您输入类似 的内容时gc fixed Greg's bug,bash 将要求您在执行函数之前关闭引号内的字符串;当您输入 时gc printf("%s", integervar) not a good idea,bash 会对括号提出异议,甚至无法确定所请求的命令/函数/内容。

我推测使用的目的$*是为了避免在命令行上引用备忘录,但这只能避免在消息中引用空格。如果消息包含其他 shell 元字符,则必须适当引用或者转义它们:

gc "fixed Greg's bug"
gc 'printf("%s", integervar) not a good idea'
gc 'fixed this & deferred that'

相关内容