Shell 带引号的函数命令

Shell function command with quotes

我正在尝试创建一个 git 快捷方式来提交消息。由于别名不支持参数我想出了这个功能:

function gcm() { git commit -m "$@" }

我的期望是提交消息而不用像这样输入引号:

gcm create cli module

但是我得到一个错误,可能是由于扩展全参数符号时的字符串插值。

error: pathspec 'cli' did not match any file(s) known to git.
error: pathspec 'module' did not match any file(s) known to git.

如何修复该函数,以便我可以使用别名来避免输入引号?

更新:

我非常喜欢这个快捷方式,所以我必须为每个人制作一个复制粘贴友好版本的解决方案

alias gcm='function() { git commit -a -m "$*" }'

您希望 "$*" 而不是 "$@",因为您希望参数扩展为单个单词而不是多个单词。

这是少数几次 "$*" 扩展实际上是可取的。通常不是。

使您的提交消息成为单个参数,而不是一系列单独的参数。

gcm () { git commit -m ""; }

并像这样调用它:

gcm "My commit message"

这样,您将获得在提交消息中键入的准确文本,而不会发生以下情况:

  • 多个连续 space 折叠为一个 space
  • 制表符和换行符等其他白色space转换为spaces
  • * 这样的字符无论如何都需要被引用以防止 shell 的特殊解释。
  • 如果IFS的值因为某些原因被改变了,它会影响你的commit message的内容:

    $ gcm () { echo "$*"; }
    $ gcm my    commit message
    my commit message
    $ IFS=:
    $ gym my    commit message
    my:commit:message