如何在bash中转义感叹号?

38

有时我想在Git提交信息中添加更多的表达性,但很遗憾,Bash似乎不支持这样做。

iblue@silence ~/git/wargames $ git commit -m "Frustrating <insert object of frustration here>!"
-bash: !": event not found

使用反斜杠进行转义可以解决问题,但是这样会将反斜杠包含在提交的信息中。

如何正确地在bash中转义感叹号?


1
你到底想要实现什么?我的意思是,提交信息中有感叹号不是正确的吗?如果不是,你想怎么处理它? - Gareth McCaughan
1
OP可能是指在提交消息中包含反斜杠。 - sappjw
4个回答

49

在单引号字符串中,感叹号会被按照字面意义保留。

例如:

git commit -m 'Frustrating <insert object of frustration here>!'

15
(恕我直言)Downvote:问题明确是关于如何转义感叹号的。您的回答解决了上述问题,对此很有帮助,但并没有回答问题本身。我通过搜索引擎来到这里,遇到了略微不同的问题,我真的需要转义双引号内的感叹号。您的解决方法对我没有帮助。如果这个问题有一个不同的标题(例如“如何解决这个感叹号问题”),那么您的回答就完全没问题了。但作为一个问答网站,您的回答没有回到点子上。 - ChristophK
我带着一个问题来了:“如何防止Bash对我的参数进行干涉”,这个答案帮了我。 - undefined

28

试试这个

git commit -m "令人沮丧的 <插入沮丧对象>"'!'

如果在字符串中间,则

"你好"'!'"世界"


10

使用单引号而不是双引号可以防止扩展。


1
如果它是字符串的一部分,您需要通过执行" ' ! ' "(不包括我添加的空格)来将其分离。 - ignacio

8
除了在感叹号中使用单引号外,在大多数 shell 中,您还可以使用反斜杠 \ 来转义它。即: git commit -m "Frustrating <insert object of frustration here>\!" 然而,我个人建议您通过将 set +Hset +o histexpand 添加到您的 .bashrc 文件来禁用 bash 扩展
如果像我一样,您从未在 shell 中使用过 bash 扩展,禁用它将允许您在任何双引号字符串中使用感叹号-不仅仅是在提交期间,而是对于所有 bash 命令。

1
我最近在Bash中使用grep时尝试在双引号字符串中使用\转义!,但它对我没有起作用,我已确认它失败的原因与OP相同。 - AJM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接