如何调整我的 bash 函数,以便我可以省略双引号?

Rya*_*yan 1 bash

一整天,我经常输入这样的内容:

git stash push -u -m "some phrase as a message"

我宁愿输入:

stpu some phrase as a message

所以在这个答案的帮助下,我在我的中创建了一个函数~./bashrc

function stpu() {
  git stash push -u -m "${@}"
}
Run Code Online (Sandbox Code Playgroud)

现在我可以输入stpu "some phrase as a message",这与我想要的非常接近。

如何调整我的函数,以便可以省略双引号?

我尝试了许多不同的变体(添加更多被转义的双引号、添加单引号等),但没有让它起作用。

Cha*_*ffy 9

如果使用代替,有时可以省略引号"$*""$@"

这会将您的所有参数连接到一个字符串中,并用空格分隔(默认情况下;IFS如果已覆盖,则为 中的第一个字符)。-m期望一个字符串跟随它(而不是每个单词一个单独的参数),所以这正是它想要的。


这是不可靠的,最好只使用引号。

安全

如果您想使用提交消息,请考虑作为示例:Make $(rm -rf ~) safe in an argument name用于安全修复。如果此字符串未加引号(或双引号),则该命令将在您的函数启动之前执行(这是有道理的:在知道其参数列表之后才能调用该函数),因此您的函数无能为力修理它。在这种情况下,使用单引号来防止发生命令替换是正确且安全的做法。

(以单引号是一个字符串包含单引号,可以考虑使用ANSI C类的字符串$'I\'m a single-quoted string that contains a single quote'

正确性

或者,再举一个例子:Process only files matching *.csv-- 如果它没有被引用,则*.csv可以替换为您运行命令的目录中存在的 CSV 文件列表。同样,这发生你的函数启动之前,所以函数内部没有任何东西可以阻止它。