如何调整我的 bash 函数以省略双引号?
Posted
技术标签:
【中文标题】如何调整我的 bash 函数以省略双引号?【英文标题】:How can I adjust my bash function such that I can omit the double-quotes? 【发布时间】:2021-02-25 15:04:52 【问题描述】:一整天,我经常输入这样的内容:
git stash push -u -m "some phrase as a message"
我更愿意输入:
stpu some phrase as a message
所以在this answer 的帮助下,我在~./bashrc
中创建了一个函数:
function stpu()
git stash push -u -m "$@"
现在我可以输入stpu "some phrase as a message"
,这与我想要的非常接近。
如何调整函数以省略双引号?
我尝试了许多不同的变体(添加更多转义的双引号、添加单引号等),但都没有成功。
【问题讨论】:
如果您希望将所有参数连接到一个字符串中,您需要使用"$*"
而不是"$@"
。也就是说,我强烈建议不要这样做;它会产生不必要的副作用。
顺便说一句,re: 函数语法,见wiki.bash-hackers.org/scripting/obsolete——最好只使用stpu()
,前面不带function
。
顺便说一句,我的回答中关于安全性和正确性的论点也是为什么运行 ssh somehost 'command to run'
比运行 ssh somehost command to run
更好。如果你不将你的参数引用到ssh
,那么它对那些用于远程系统的参数的作用与"$*"
的行为相同——将它们组合成一个字符串,但仅在调用 shell 之后已经先与他们合作了。
请注意,引号仅用于批量转义单个字符;他们没有定义字符串(因为 shell 中的所有内容都已经是字符串)。 "foo bar"
等同于 \f\o\o\ \b\a\r
,引号中的每个字符都被视为反斜杠转义。由于这些字符中的大多数对 shell 没有特殊含义(\f
只是 f
等),因此它也等同于 foo\ bar
,因为 shell 只会使用空格来解析序列作为两个单词,而不是包含空格的单个单词。
【参考方案1】:
如果您使用"$*"
而不是"$@"
,您可以有时省略引号
这会将所有参数连接成一个字符串,用空格分隔(默认情况下;IFS
中的第一个字符,如果它已被覆盖)。 -m
期望后面跟着一个字符串(而不是每个单词一个单独的参数),所以这正是它想要的。
这不可靠,最好只使用引号。
安全
如果您想使用提交消息作为示例:Make $(rm -rf ~) safe in an argument name
进行安全修复。如果此字符串未加引号(或双引号),则在您的函数启动之前执行该命令(这是有道理的:在知道其参数列表之前不能调用函数),因此您的函数无能为力修理它。在这种情况下,使用单引号来防止发生命令替换是正确且安全的做法。
(要单引号包含单引号的字符串,请考虑使用ANSI C-like strings:$'I\'m a single-quoted string that contains a single quote'
)
正确性
或者,作为另一个示例:Process only files matching *.csv
- 如果未引用,*.csv
可以替换为您运行命令的目录中存在的 CSV 文件列表。同样,这发生在您的函数启动之前,因此函数内部没有任何东西可以阻止它。
【讨论】:
哇,好点。我很高兴我问了。当我被允许时,我会接受答案。谢谢。以上是关于如何调整我的 bash 函数以省略双引号?的主要内容,如果未能解决你的问题,请参考以下文章
如何删除 jq 输出中的双引号以在 bash 中解析 json 文件?