Shell函数命令带引号

时间:2015-04-24 11:48:03

标签: bash shell command-line-interface zsh

我正在尝试使用git快捷方式提交消息。由于别名不支持参数,我想出了这个函数:

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

我的期望是提交一条消息,甚至不输入这样的引号:

gcm create cli module

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

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 "$*" }'

2 个答案:

答案 0 :(得分:6)

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

这是"$*"扩展实际需要的少数几次之一。通常不是。

答案 1 :(得分:2)

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

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

并像这样调用它:

gcm "My commit message"

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

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

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