带引号的外壳函数命令



我正在尝试制作一个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 "$1"; }

并像这样调用它:

gcm "My commit message"

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

  • 多个连续空格折叠为一个空格
  • 其他空格,例如转换为空格的制表符和换行
  • *这样的字符无论如何都需要引用,以防止外壳的特殊解释。
  • 如果IFS的值由于某种原因而更改,它将影响提交消息的内容:

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

最新更新