我想做类似bzr commit -m "It works!"的事情。我可以通过执行bzr commit -m "It works\!"来逃避感叹号。但是,然后我的提交消息包括反斜杠。如何在仍然忽略反斜杠的同时逃脱感叹号?

评论

正在执行bzr commit -m“有效”!也可以。

正如我在您放置的命令之前指出的那样,它实际上是可以单独使用的:) bzr commit -m“它可以使用!”

带有引号的更奇怪的情况:stackoverflow.com/questions/22125658/…

尽管可以接受的答案是解决提交问题的一个不错的解决方法,但我认为这并不是实际问题的答案:Bash历史记录扩展。请考虑接受丹尼斯的回答吗?

@ h4unt3r似乎不为我工作?回声“行得通!” -bash:!“:找不到事件

#1 楼

由于您不依赖bash扩展提交消息中的变量,因此可以改用单引号。 bash不会将单引号中的字符串扩展。

bzr commit -m 'This does work!' 


评论


由于问题是“我如何逃脱感叹号?”而不是“我如何不扩展感叹号?”我认为这是不正确的。在某些情况下(例如,在同一命令行中使用撇号和感叹号时),此操作不起作用。下面的答案可以更好地满足许多人的需求。

–扬
2011年5月24日17:55

@Jann:您对此是100%正确的,但是我认为这里的问题是有关超级用户的许多问题:我们要回答这个问题还是直接帮助人们解决他们的特定问题。我认为这两种方式都有用,这是在寻求特定问题的帮助。

–本杰明·班尼尔(Benjamin Bannier)
2011年5月24日18:17

碰!这是一个特定的问题。我只是想对我的问题做出回答,以便能够在许多情况下使用。 PS:我什至提到这是因为我需要将撇号和感叹号都传递给Perl程序,并且需要以下解决方案。 :)

–扬
2011年5月24日18:37

我同意本杰明和詹恩,但表示反对。搜索引擎将这个问题的标题编入索引,这就是我来这里的原因,而且可能大多数用户都来过这里。这就是为什么我认为,实际问题反映出背后的问题很重要。在其他论坛中,建议人们(几乎被迫)准确询问他们要寻找的东西。回答表达不佳的问题会支持草率,这就是我在这里投票的确切原因。作为一种折衷方案,我的建议是帮助调整标题,以便反映实际问题。

–ChristophK
18年1月6日在10:49



如果我需要在Heredoc中使用感叹号怎么办?

– Andrei LED
20-04-22在10:13

#2 楼

如果您想使用双引号和感叹号,则可以使用以下另一种方法: >
例如:

echo "It's broken"'!'


奖金:可以使用类似的技术来在Sh或Bash中转义任何文本(借助sed):请参见这个答案的第一个选择。此外,如果已安装!,则可能已经具有bash-completion功能。

评论


很好的提示,JWD。我没有意识到可以仅通过省略bash字符串之间的空格来串联它们。

–艾伦·H。
11年8月26日在21:32

实际上,如果感叹号位于字符串的末尾,则您将清楚地显示“生日快乐!”。将按预期工作,否则您可以使用反斜杠将其转义,但是反斜杠也将被打印出来XD Bash不适合胆小的人使用:)

– h4unt3r
2014年8月18日在3:24

@ h4unt3r:奇怪,这不是我的经验。对我来说,回声“生日快乐!”输出2行。第一个是回声“生日快乐”(无感叹号),第二个是“生日快乐”(再次无感叹号)。进行此测试时,是否打开了历史记录扩展?

– jwd
14年8月18日在21:05

@jwd您正在运行什么版本的bash?我一直在发展历史。你不小心用了两个!为您测试?

– h4unt3r
2014年8月19日,0:15



@ h4unt3r:版本4.1.2(1)-发行版(x86_64-redhat-linux-gnu),绝对只有一个!正在使用。我在$ SHELLOPTS中有histexpand。但是,我只是尝试在另一台机器上尝试4.3.18(2)-release,它的行为与您描述的相同。我猜这是一个已修复的错误。

– jwd
2014年8月19日在20:28

#3 楼

关闭历史记录扩展:

set +H




set +o histexpand


您可以将其中一个命令添加到~/.bashrc如果您通常不使用历史记录扩展。

Bash 4.3添加了一种特殊情况:


如果历史记录扩展字符紧随其后,则也将其视为引号用双引号括起来的字符串中的结束双引号


评论


谢谢-这行得通,但是我必须设置+ o histexpand,而不是设置-o histexpand。您可以编辑答案来解决此问题吗?

–马修
10年4月22日在19:04

糟糕,错字,对不起。固定。

–丹尼斯·威廉姆森
10年4月22日在22:29

优秀!一直在寻找AGES。...vm!作为转义将无法工作...我也不想使用单引号...我将其添加到我的.bashrc thx !!中,从未使用过!在脚本中,一无所有!一直很麻烦...

–水瓶座力量
13年7月18日在15:19

太棒了!回声“ @AquariusPower!”

– joehanna
16 Jun 30'在0:28



#4 楼

使用单引号(')而不是双引号(“)。单引号会关闭对其中内容的所有解释,而双引号只会关闭部分内容。

bzr commit -m 'It works!'


#5 楼

我刚刚发现了另一种方法,至少可以与要用感叹号打点的qing字符串(句子)一起使用。它围绕Bash histexpand进行了一次或多或少的最终运行,并且只花了一点点时间进行编码。 .ascii-code.com /是21,所以如果将echo放在字符串的末尾\x21上,使echo -e $foo成为其自己的扩展回声[即$foo],则再次使用foo=$(echo -e "$foo")时得到的是带有echo $foo的字符串在最后。而且也无需切换histexpand。

在Bash 4+中可以肯定地工作。早期版本,ymmv。

评论


嗯,这对我不起作用。

–lzap
2014年6月10日上午11:52

我听不懂你在说什么。 'echo -e'和'printf'解释转义的八进制,十六进制和Unicode代码。如果您使用其中任何一个,则可以使用“ \ 041”(八进制表示“!”)或“ \ x21”(十六进制)代替感叹号。例如:printf“ OMG \ 041”。如果要在不是echo或printf的地方构建双引号的字符串(如OP询问的提交字符串),则可以将$(echo -e“ \ 041”)嵌入在感叹号所在的字符串中。像这样:bzr commit -m“这是一个很棒的commit $(echo -e” \ 041“)”。

–托德·沃尔顿(Todd Walton)
19年1月16日在20:16

#6 楼

最近,我找到了另一种方法。
这是让Bash为您转义的一种通用方法,因此对于任意情况都很方便。
来自本文:

输入以#注释开头的Bash行,然后在下一行运行!:q,以查看>正确应用Bash转义后会发生什么。添加p修饰符(因此:!:q:p以避免出现“找不到命令”错误)