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
我正在尝试创建一个 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